diff --git a/Makefile b/Makefile index 2538dc850e88b..3c21f4519136a 100644 --- a/Makefile +++ b/Makefile @@ -820,10 +820,6 @@ RERUN := $(TOOLINGDIR)/bin/rerun $(RERUN): $(wildcard $(TOOLINGDIR)/cmd/rerun/*.go) cd $(TOOLINGDIR) && go build -o "$@" ./cmd/rerun -RELEASE_NOTES_GEN := $(TOOLINGDIR)/bin/release-notes -$(RELEASE_NOTES_GEN): $(wildcard $(TOOLINGDIR)/cmd/release-notes/*.go) - cd $(TOOLINGDIR) && go build -o "$@" ./cmd/release-notes - .PHONY: tooling tooling: ensure-gotestsum $(DIFF_TEST) @@ -1823,10 +1819,11 @@ changelog: # will also fail to create a release. # # For more information on release notes generation see ./build.assets/tooling/cmd/release-notes +RELEASE_NOTES_GEN = github.com/gravitational/shared-workflows/tools/release-notes@latest .PHONY: create-github-release create-github-release: LATEST = false create-github-release: GITHUB_RELEASE_LABELS = "" -create-github-release: $(RELEASE_NOTES_GEN) +create-github-release: @NOTES=$$($(RELEASE_NOTES_GEN) --labels=$(GITHUB_RELEASE_LABELS) $(VERSION) CHANGELOG.md) && gh release create v$(VERSION) \ -t "Teleport $(VERSION)" \ --latest=$(LATEST) \ diff --git a/build.assets/tooling/cmd/release-notes/README.md b/build.assets/tooling/cmd/release-notes/README.md deleted file mode 100644 index 1a8c8e41f09f4..0000000000000 --- a/build.assets/tooling/cmd/release-notes/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# release-notes - -A release notes generator for Teleport releases. - -## Usage - -```shell -usage: release-notes - - -Flags: - --[no-]help Show context-sensitive help (also try --help-long and --help-man). - -Args: - Version to be released - Path to CHANGELOG.md -``` - -This script is expected to be run along side the `gh` CLI to create a release. - -```shell -release-notes $VERSION CHANGELOG.md | gh release create \ - -t "Teleport $VERSION" \ - --latest=false \ - --target=$BRANCH \ - --verify-tag \ - -F - \ - -``` \ No newline at end of file diff --git a/build.assets/tooling/cmd/release-notes/main.go b/build.assets/tooling/cmd/release-notes/main.go deleted file mode 100644 index 8ec06e4c43c93..0000000000000 --- a/build.assets/tooling/cmd/release-notes/main.go +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Teleport - * Copyright (C) 2024 Gravitational, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package main - -import ( - "fmt" - "log" - "os" - - "github.com/alecthomas/kingpin/v2" -) - -var ( - version = kingpin.Arg("version", "Version to be released").Required().String() - changelog = kingpin.Arg("changelog", "Path to CHANGELOG.md").Required().String() - labels = kingpin.Flag("labels", "Labels to apply to the end of a release, e.g. security labels").String() -) - -func main() { - kingpin.Parse() - - clFile, err := os.Open(*changelog) - if err != nil { - log.Fatal(err) - } - defer clFile.Close() - - gen := &releaseNotesGenerator{ - releaseVersion: *version, - labels: *labels, - } - - notes, err := gen.generateReleaseNotes(clFile) - if err != nil { - log.Fatal(err) - } - fmt.Println(notes) -} diff --git a/build.assets/tooling/cmd/release-notes/release_notes.go b/build.assets/tooling/cmd/release-notes/release_notes.go deleted file mode 100644 index 6795efc841dbb..0000000000000 --- a/build.assets/tooling/cmd/release-notes/release_notes.go +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Teleport - * Copyright (C) 2024 Gravitational, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package main - -import ( - "bufio" - "bytes" - _ "embed" - "fmt" - "html/template" - "io" - "strings" - - "github.com/gravitational/trace" -) - -//go:embed template/release-notes.md.tmpl -var tmpl string - -type tmplInfo struct { - Version string - Description string - Labels string -} - -var ( - releaseNotesTemplate = template.Must(template.New("release notes").Parse(tmpl)) -) - -type releaseNotesGenerator struct { - // releaseVersion is the version for the release. - // This will be compared against the version present in the changelog. - releaseVersion string - // labels is a string applied to the end of the release description - // that will be picked up by other automation. - // - // It won't be validated but it is expected to be a comma separated list of - // entries in the format - // label=key - labels string -} - -func (r *releaseNotesGenerator) generateReleaseNotes(md io.Reader) (string, error) { - desc, err := r.parseMD(md) - if err != nil { - return "", err - } - - info := tmplInfo{ - Version: r.releaseVersion, - Description: desc, - Labels: r.labels, - } - var buff bytes.Buffer - if err := releaseNotesTemplate.Execute(&buff, info); err != nil { - return "", trace.Wrap(err) - } - return buff.String(), nil -} - -// parseMD is a simple implementation of a parser to extract the description from a changelog. -// Will scan for the first double header and pull the version from that. -// Will pull all information between the first and second double header for the description. -func (r *releaseNotesGenerator) parseMD(md io.Reader) (string, error) { - sc := bufio.NewScanner(md) - - // Extract the first second-level heading - var heading string - for sc.Scan() { - if strings.HasPrefix(sc.Text(), "## ") { - heading = strings.TrimSpace(strings.TrimPrefix(sc.Text(), "## ")) - break - } - } - if err := sc.Err(); err != nil { - return "", trace.Wrap(err) - } - if heading == "" { - return "", trace.BadParameter("no second-level heading found in changelog") - } - - // Expected heading would be something like "16.0.4 (MM/DD/YY)" - parts := strings.SplitN(heading, " ", 2) - if parts[0] != r.releaseVersion { - return "", trace.BadParameter("changelog version number did not match expected version number: %q != %q", parts[0], r.releaseVersion) - } - - // Write everything until next header to buffer - var buff bytes.Buffer - for sc.Scan() && !strings.HasPrefix(sc.Text(), "## ") { - if _, err := fmt.Fprintln(&buff, sc.Text()); err != nil { - return "", trace.Wrap(err) - } - } - if err := sc.Err(); err != nil { - return "", trace.Wrap(err) - } - - return strings.TrimSpace(buff.String()), nil -} diff --git a/build.assets/tooling/cmd/release-notes/release_notes_test.go b/build.assets/tooling/cmd/release-notes/release_notes_test.go deleted file mode 100644 index 67af99d28ce9c..0000000000000 --- a/build.assets/tooling/cmd/release-notes/release_notes_test.go +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Teleport - * Copyright (C) 2024 Gravitational, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package main - -import ( - _ "embed" - "os" - "path/filepath" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func Test_generateReleaseNotes(t *testing.T) { - tests := []struct { - name string - releaseVersion string - labels string - clFile *os.File - want string - wantErr bool - }{ - { - name: "happy path", - releaseVersion: "16.0.1", - clFile: mustOpen(t, "test-changelog.md"), - want: mustRead(t, "expected-release-notes.md"), - wantErr: false, - }, - { - name: "with labels", - releaseVersion: "16.0.1", - labels: "security-patch=yes, security-patch-alts=v16.0.0,v16.0.1", - clFile: mustOpen(t, "test-changelog.md"), - want: mustRead(t, "expected-with-labels.md"), - wantErr: false, - }, - { - name: "version mismatch", - releaseVersion: "15.0.1", // test-changelog has 16.0.1 - clFile: mustOpen(t, "test-changelog.md"), - want: "", - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - r := &releaseNotesGenerator{ - releaseVersion: tt.releaseVersion, - labels: tt.labels, - } - - got, err := r.generateReleaseNotes(tt.clFile) - if tt.wantErr { - assert.Error(t, err) - return - } - assert.NoError(t, err) - assert.Equal(t, tt.want, got) - }) - } -} - -func mustOpen(t *testing.T, filename string) *os.File { - testfile, err := os.Open(filepath.Join("testdata", filename)) - require.NoError(t, err) - return testfile -} - -func mustRead(t *testing.T, filename string) string { - expectedReleaseNotes, err := os.ReadFile(filepath.Join("testdata", filename)) - require.NoError(t, err) - return string(expectedReleaseNotes) -} diff --git a/build.assets/tooling/cmd/release-notes/template/release-notes.md.tmpl b/build.assets/tooling/cmd/release-notes/template/release-notes.md.tmpl deleted file mode 100644 index a4825e3ac7d40..0000000000000 --- a/build.assets/tooling/cmd/release-notes/template/release-notes.md.tmpl +++ /dev/null @@ -1,26 +0,0 @@ -## Description - -{{ .Description }} - -## Download - -Download the current and previous releases of Teleport at https://goteleport.com/download. - -## Plugins - -Download the current release of Teleport plugins from the links below. -* Slack [Linux amd64](https://cdn.teleport.dev/teleport-access-slack-v{{ .Version }}-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-access-slack-v{{ .Version }}-linux-arm64-bin.tar.gz) -* Mattermost [Linux amd64](https://cdn.teleport.dev/teleport-access-mattermost-v{{ .Version }}-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-access-mattermost-v{{ .Version }}-linux-arm64-bin.tar.gz) -* Discord [Linux amd64](https://cdn.teleport.dev/teleport-access-discord-v{{ .Version }}-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-access-discord-v{{ .Version }}-linux-arm64-bin.tar.gz) -* Terraform Provider [Linux amd64](https://cdn.teleport.dev/terraform-provider-teleport-v{{ .Version }}-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/terraform-provider-teleport-v{{ .Version }}-linux-arm64-bin.tar.gz) | [macOS amd64](https://cdn.teleport.dev/terraform-provider-teleport-v{{ .Version }}-darwin-amd64-bin.tar.gz) | [macOS arm64](https://cdn.teleport.dev/terraform-provider-teleport-v{{ .Version }}-darwin-arm64-bin.tar.gz) | [macOS universal](https://cdn.teleport.dev/terraform-provider-teleport-v{{ .Version }}-darwin-universal-bin.tar.gz) -* Event Handler [Linux amd64](https://cdn.teleport.dev/teleport-event-handler-v{{ .Version }}-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-event-handler-v{{ .Version }}-linux-arm64-bin.tar.gz) | [macOS amd64](https://cdn.teleport.dev/teleport-event-handler-v{{ .Version }}-darwin-amd64-bin.tar.gz) -* PagerDuty [Linux amd64](https://cdn.teleport.dev/teleport-access-pagerduty-v{{ .Version }}-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-access-pagerduty-v{{ .Version }}-linux-arm64-bin.tar.gz) -* Jira [Linux amd64](https://cdn.teleport.dev/teleport-access-jira-v{{ .Version }}-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-access-jira-v{{ .Version }}-linux-arm64-bin.tar.gz) -* Email [Linux amd64](https://cdn.teleport.dev/teleport-access-email-v{{ .Version }}-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-access-email-v{{ .Version }}-linux-arm64-bin.tar.gz) -* Microsoft Teams [Linux amd64](https://cdn.teleport.dev/teleport-access-msteams-v{{ .Version }}-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-access-msteams-v{{ .Version }}-linux-arm64-bin.tar.gz) -{{- if .Labels }} - ---- - -labels: {{ .Labels }} -{{- end }} diff --git a/build.assets/tooling/cmd/release-notes/testdata/expected-release-notes.md b/build.assets/tooling/cmd/release-notes/testdata/expected-release-notes.md deleted file mode 100644 index a8e835ad84ad5..0000000000000 --- a/build.assets/tooling/cmd/release-notes/testdata/expected-release-notes.md +++ /dev/null @@ -1,26 +0,0 @@ -## Description - -* `tctl` now ignores any configuration file if the auth_service section is disabled, and prefer loading credentials from a given identity file or tsh profile instead. [#43115](https://github.com/gravitational/teleport/pull/43115) -* Skip `jamf_service` validation when the service is not enabled. [#43095](https://github.com/gravitational/teleport/pull/43095) -* Fix v16.0.0 amd64 Teleport plugin images using arm64 binaries. [#43084](https://github.com/gravitational/teleport/pull/43084) -* Add ability to edit user traits from the Web UI. [#43067](https://github.com/gravitational/teleport/pull/43067) -* Enforce limits when reading events from Firestore for large time windows to prevent OOM events. [#42966](https://github.com/gravitational/teleport/pull/42966) -* Allow all authenticated users to read the cluster `vnet_config`. [#42957](https://github.com/gravitational/teleport/pull/42957) -* Improve search and predicate/label based dialing performance in large clusters under very high load. [#42943](https://github.com/gravitational/teleport/pull/42943) - -## Download - -Download the current and previous releases of Teleport at https://goteleport.com/download. - -## Plugins - -Download the current release of Teleport plugins from the links below. -* Slack [Linux amd64](https://cdn.teleport.dev/teleport-access-slack-v16.0.1-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-access-slack-v16.0.1-linux-arm64-bin.tar.gz) -* Mattermost [Linux amd64](https://cdn.teleport.dev/teleport-access-mattermost-v16.0.1-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-access-mattermost-v16.0.1-linux-arm64-bin.tar.gz) -* Discord [Linux amd64](https://cdn.teleport.dev/teleport-access-discord-v16.0.1-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-access-discord-v16.0.1-linux-arm64-bin.tar.gz) -* Terraform Provider [Linux amd64](https://cdn.teleport.dev/terraform-provider-teleport-v16.0.1-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/terraform-provider-teleport-v16.0.1-linux-arm64-bin.tar.gz) | [macOS amd64](https://cdn.teleport.dev/terraform-provider-teleport-v16.0.1-darwin-amd64-bin.tar.gz) | [macOS arm64](https://cdn.teleport.dev/terraform-provider-teleport-v16.0.1-darwin-arm64-bin.tar.gz) | [macOS universal](https://cdn.teleport.dev/terraform-provider-teleport-v16.0.1-darwin-universal-bin.tar.gz) -* Event Handler [Linux amd64](https://cdn.teleport.dev/teleport-event-handler-v16.0.1-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-event-handler-v16.0.1-linux-arm64-bin.tar.gz) | [macOS amd64](https://cdn.teleport.dev/teleport-event-handler-v16.0.1-darwin-amd64-bin.tar.gz) -* PagerDuty [Linux amd64](https://cdn.teleport.dev/teleport-access-pagerduty-v16.0.1-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-access-pagerduty-v16.0.1-linux-arm64-bin.tar.gz) -* Jira [Linux amd64](https://cdn.teleport.dev/teleport-access-jira-v16.0.1-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-access-jira-v16.0.1-linux-arm64-bin.tar.gz) -* Email [Linux amd64](https://cdn.teleport.dev/teleport-access-email-v16.0.1-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-access-email-v16.0.1-linux-arm64-bin.tar.gz) -* Microsoft Teams [Linux amd64](https://cdn.teleport.dev/teleport-access-msteams-v16.0.1-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-access-msteams-v16.0.1-linux-arm64-bin.tar.gz) diff --git a/build.assets/tooling/cmd/release-notes/testdata/expected-with-labels.md b/build.assets/tooling/cmd/release-notes/testdata/expected-with-labels.md deleted file mode 100644 index 4a91b668129d2..0000000000000 --- a/build.assets/tooling/cmd/release-notes/testdata/expected-with-labels.md +++ /dev/null @@ -1,30 +0,0 @@ -## Description - -* `tctl` now ignores any configuration file if the auth_service section is disabled, and prefer loading credentials from a given identity file or tsh profile instead. [#43115](https://github.com/gravitational/teleport/pull/43115) -* Skip `jamf_service` validation when the service is not enabled. [#43095](https://github.com/gravitational/teleport/pull/43095) -* Fix v16.0.0 amd64 Teleport plugin images using arm64 binaries. [#43084](https://github.com/gravitational/teleport/pull/43084) -* Add ability to edit user traits from the Web UI. [#43067](https://github.com/gravitational/teleport/pull/43067) -* Enforce limits when reading events from Firestore for large time windows to prevent OOM events. [#42966](https://github.com/gravitational/teleport/pull/42966) -* Allow all authenticated users to read the cluster `vnet_config`. [#42957](https://github.com/gravitational/teleport/pull/42957) -* Improve search and predicate/label based dialing performance in large clusters under very high load. [#42943](https://github.com/gravitational/teleport/pull/42943) - -## Download - -Download the current and previous releases of Teleport at https://goteleport.com/download. - -## Plugins - -Download the current release of Teleport plugins from the links below. -* Slack [Linux amd64](https://cdn.teleport.dev/teleport-access-slack-v16.0.1-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-access-slack-v16.0.1-linux-arm64-bin.tar.gz) -* Mattermost [Linux amd64](https://cdn.teleport.dev/teleport-access-mattermost-v16.0.1-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-access-mattermost-v16.0.1-linux-arm64-bin.tar.gz) -* Discord [Linux amd64](https://cdn.teleport.dev/teleport-access-discord-v16.0.1-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-access-discord-v16.0.1-linux-arm64-bin.tar.gz) -* Terraform Provider [Linux amd64](https://cdn.teleport.dev/terraform-provider-teleport-v16.0.1-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/terraform-provider-teleport-v16.0.1-linux-arm64-bin.tar.gz) | [macOS amd64](https://cdn.teleport.dev/terraform-provider-teleport-v16.0.1-darwin-amd64-bin.tar.gz) | [macOS arm64](https://cdn.teleport.dev/terraform-provider-teleport-v16.0.1-darwin-arm64-bin.tar.gz) | [macOS universal](https://cdn.teleport.dev/terraform-provider-teleport-v16.0.1-darwin-universal-bin.tar.gz) -* Event Handler [Linux amd64](https://cdn.teleport.dev/teleport-event-handler-v16.0.1-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-event-handler-v16.0.1-linux-arm64-bin.tar.gz) | [macOS amd64](https://cdn.teleport.dev/teleport-event-handler-v16.0.1-darwin-amd64-bin.tar.gz) -* PagerDuty [Linux amd64](https://cdn.teleport.dev/teleport-access-pagerduty-v16.0.1-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-access-pagerduty-v16.0.1-linux-arm64-bin.tar.gz) -* Jira [Linux amd64](https://cdn.teleport.dev/teleport-access-jira-v16.0.1-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-access-jira-v16.0.1-linux-arm64-bin.tar.gz) -* Email [Linux amd64](https://cdn.teleport.dev/teleport-access-email-v16.0.1-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-access-email-v16.0.1-linux-arm64-bin.tar.gz) -* Microsoft Teams [Linux amd64](https://cdn.teleport.dev/teleport-access-msteams-v16.0.1-linux-amd64-bin.tar.gz) | [Linux arm64](https://cdn.teleport.dev/teleport-access-msteams-v16.0.1-linux-arm64-bin.tar.gz) - ---- - -labels: security-patch=yes, security-patch-alts=v16.0.0,v16.0.1 diff --git a/build.assets/tooling/cmd/release-notes/testdata/test-changelog.md b/build.assets/tooling/cmd/release-notes/testdata/test-changelog.md deleted file mode 100644 index 912a9a1060100..0000000000000 --- a/build.assets/tooling/cmd/release-notes/testdata/test-changelog.md +++ /dev/null @@ -1,23 +0,0 @@ -# Changelog - -## 16.0.1 (06/17/24) - -* `tctl` now ignores any configuration file if the auth_service section is disabled, and prefer loading credentials from a given identity file or tsh profile instead. [#43115](https://github.com/gravitational/teleport/pull/43115) -* Skip `jamf_service` validation when the service is not enabled. [#43095](https://github.com/gravitational/teleport/pull/43095) -* Fix v16.0.0 amd64 Teleport plugin images using arm64 binaries. [#43084](https://github.com/gravitational/teleport/pull/43084) -* Add ability to edit user traits from the Web UI. [#43067](https://github.com/gravitational/teleport/pull/43067) -* Enforce limits when reading events from Firestore for large time windows to prevent OOM events. [#42966](https://github.com/gravitational/teleport/pull/42966) -* Allow all authenticated users to read the cluster `vnet_config`. [#42957](https://github.com/gravitational/teleport/pull/42957) -* Improve search and predicate/label based dialing performance in large clusters under very high load. [#42943](https://github.com/gravitational/teleport/pull/42943) - -## 16.0.0 (06/13/24) - -Teleport 16 brings the following new features and improvements: - -- Teleport VNet -- Device Trust for the Web UI -- Increased support for per-session MFA -- Web UI notification system -- Access requests from the resources view -- `tctl` for Windows -- Teleport plugins improvements