diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index c6c45b86ba..0b2a3b95fd 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -75,9 +75,9 @@ jobs: matrix: # test latest features and compatibility of lower version include: - - feature_version: 6.0.0 + - pd_version: 6.0.0 tidb_version: nightly - - feature_version: 5.0.0 + - pd_version: 5.0.0 tidb_version: v5.0.0 steps: - name: Checkout code @@ -145,13 +145,13 @@ jobs: make run & env: UI: 1 - FEATURE_VERSION: ${{ matrix.feature_version }} + PD_VERSION: ${{ matrix.pd_version }} - name: Run E2E Features Test run: make test_e2e env: SERVER_URL: http://127.0.0.1:12333/dashboard/ CI: true - FEATURE_VERSION: ${{ matrix.feature_version }} + PD_VERSION: ${{ matrix.pd_version }} TIDB_VERSION: ${{ matrix.tidb_version }} - name: Archive Test Results if: always() diff --git a/.github/workflows/upload-e2e-snapshots.yaml b/.github/workflows/upload-e2e-snapshots.yaml index b6f75dc3ac..18a72e0ac3 100644 --- a/.github/workflows/upload-e2e-snapshots.yaml +++ b/.github/workflows/upload-e2e-snapshots.yaml @@ -17,9 +17,9 @@ jobs: matrix: # test latest features and compatibility of lower version include: - - feature_version: 6.0.0 + - pd_version: 6.0.0 tidb_version: nightly - - feature_version: 5.0.0 + - pd_version: 5.0.0 tidb_version: v5.0.0 steps: - name: Checkout code @@ -88,13 +88,13 @@ jobs: make run & env: UI: 1 - FEATURE_VERSION: ${{ matrix.feature_version }} + PD_VERSION: ${{ matrix.pd_version }} - name: Run E2E Features Test run: make e2e_test env: SERVER_URL: http://127.0.0.1:12333/dashboard/ CI: true - FEATURE_VERSION: ${{ matrix.feature_version }} + PD_VERSION: ${{ matrix.pd_version }} TIDB_VERSION: ${{ matrix.tidb_version }} CYPRESS_ALLOW_SCREENSHOT: true - name: Archive Test Results @@ -106,5 +106,5 @@ jobs: - name: Upload snapshots artifact uses: actions/upload-artifact@v2 with: - name: e2e-snapshots-${{ matrix.feature_version }} + name: e2e-snapshots-${{ matrix.pd_version }} path: ${{ github.workspace }}/ui/cypress/snapshots/**/* diff --git a/Makefile b/Makefile index 5e983309f1..f84cc4e075 100755 --- a/Makefile +++ b/Makefile @@ -4,7 +4,9 @@ BUILD_TAGS ?= LDFLAGS ?= -FEATURE_VERSION ?= 6.0.0 +PD_VERSION ?= 6.0.0 + +TIDB_VERSION ?= latest ifeq ($(UI),1) BUILD_TAGS += ui_server @@ -12,12 +14,10 @@ endif LDFLAGS += -X "$(DASHBOARD_PKG)/pkg/utils/version.InternalVersion=$(shell grep -v '^\#' ./release-version)" LDFLAGS += -X "$(DASHBOARD_PKG)/pkg/utils/version.Standalone=Yes" -LDFLAGS += -X "$(DASHBOARD_PKG)/pkg/utils/version.PDVersion=N/A" +LDFLAGS += -X "$(DASHBOARD_PKG)/pkg/utils/version.PDVersion=$(PD_VERSION)" LDFLAGS += -X "$(DASHBOARD_PKG)/pkg/utils/version.BuildTime=$(shell date -u '+%Y-%m-%d %I:%M:%S')" LDFLAGS += -X "$(DASHBOARD_PKG)/pkg/utils/version.BuildGitHash=$(shell git rev-parse HEAD)" -TIDB_VERSION ?= latest - default: server .PHONY: clean @@ -73,11 +73,11 @@ endif .PHONY: run run: - bin/tidb-dashboard --debug --experimental --feature-version "$(FEATURE_VERSION)" --host 0.0.0.0 + bin/tidb-dashboard --debug --experimental --host 0.0.0.0 test_e2e_compat_features: cd ui &&\ - yarn run:e2e-test:compat-features --env FEATURE_VERSION=$(FEATURE_VERSION) TIDB_VERSION=$(TIDB_VERSION) + yarn run:e2e-test:compat-features --env PD_VERSION=$(PD_VERSION) TIDB_VERSION=$(TIDB_VERSION) test_e2e_common_features: cd ui &&\ diff --git a/cmd/tidb-dashboard/main.go b/cmd/tidb-dashboard/main.go index 58865bf19c..56ae4b60d8 100755 --- a/cmd/tidb-dashboard/main.go +++ b/cmd/tidb-dashboard/main.go @@ -26,6 +26,7 @@ import ( "sync" "syscall" + "github.com/Masterminds/semver" "github.com/pingcap/log" flag "github.com/spf13/pflag" "go.etcd.io/etcd/pkg/transport" @@ -53,6 +54,10 @@ type DashboardCLIConfig struct { // NewCLIConfig generates the configuration of the dashboard in standalone mode. func NewCLIConfig() *DashboardCLIConfig { + if _, err := semver.NewVersion(version.PDVersion); err != nil { + log.Fatal("Invalid sematic PD Version", zap.Error(err), zap.String("pd_version", version.PDVersion)) + } + cfg := &DashboardCLIConfig{} cfg.CoreConfig = config.Default() @@ -65,7 +70,6 @@ func NewCLIConfig() *DashboardCLIConfig { flag.StringVar(&cfg.CoreConfig.PDEndPoint, "pd", cfg.CoreConfig.PDEndPoint, "PD endpoint address that Dashboard Server connects to") flag.BoolVar(&cfg.CoreConfig.EnableTelemetry, "telemetry", cfg.CoreConfig.EnableTelemetry, "allow telemetry") flag.BoolVar(&cfg.CoreConfig.EnableExperimental, "experimental", cfg.CoreConfig.EnableExperimental, "allow experimental features") - flag.StringVar(&cfg.CoreConfig.FeatureVersion, "feature-version", cfg.CoreConfig.FeatureVersion, "target TiDB version for standalone mode") showVersion := flag.BoolP("version", "v", false, "print version information and exit") diff --git a/pkg/apiserver/apiserver.go b/pkg/apiserver/apiserver.go index ec818dcd06..4ec544a0f5 100644 --- a/pkg/apiserver/apiserver.go +++ b/pkg/apiserver/apiserver.go @@ -146,7 +146,7 @@ func (s *Service) Start(ctx context.Context) error { s.app = fx.New( fx.Logger(utils.NewFxPrinter()), - fx.Supply(featureflag.NewRegistry(s.config.FeatureVersion)), + fx.Supply(featureflag.NewRegistry(version.PDVersion)), Modules, fx.Provide( s.provideLocals, diff --git a/pkg/apiserver/conprof/service.go b/pkg/apiserver/conprof/service.go index 87c0a9c7ed..3e0de9ccb6 100644 --- a/pkg/apiserver/conprof/service.go +++ b/pkg/apiserver/conprof/service.go @@ -28,16 +28,16 @@ type ServiceParams struct { } type Service struct { - FeatureFlagConprof *featureflag.FeatureFlag + params ServiceParams + featureConprof *featureflag.FeatureFlag - params ServiceParams lifecycleCtx context.Context } func newService(lc fx.Lifecycle, p ServiceParams) *Service { s := &Service{ - FeatureFlagConprof: p.FeatureFlags.Register("conprof", ">= 5.3.0"), - params: p, + params: p, + featureConprof: p.FeatureFlags.Register("conprof", ">= 5.3.0"), } lc.Append(fx.Hook{ @@ -54,7 +54,7 @@ func newService(lc fx.Lifecycle, p ServiceParams) *Service { func registerRouter(r *gin.RouterGroup, auth *user.AuthService, s *Service) { endpoint := r.Group("/continuous_profiling") - endpoint.Use(s.FeatureFlagConprof.VersionGuard()) + endpoint.Use(s.featureConprof.VersionGuard()) { endpoint.GET("/config", auth.MWAuthRequired(), s.params.NgmProxy.Route("/config")) endpoint.POST("/config", auth.MWAuthRequired(), auth.MWRequireWritePriv(), s.params.NgmProxy.Route("/config")) diff --git a/pkg/apiserver/info/info.go b/pkg/apiserver/info/info.go index 2c421da5ca..5b9fc60e4d 100644 --- a/pkg/apiserver/info/info.go +++ b/pkg/apiserver/info/info.go @@ -8,7 +8,6 @@ import ( "sort" "strings" - "github.com/Masterminds/semver" "github.com/gin-gonic/gin" "github.com/thoas/go-funk" "go.etcd.io/etcd/clientv3" @@ -35,12 +34,17 @@ type ServiceParams struct { } type Service struct { - params ServiceParams + params ServiceParams + featureNgm *featureflag.FeatureFlag + lifecycleCtx context.Context } func NewService(lc fx.Lifecycle, p ServiceParams) *Service { - s := &Service{params: p} + s := &Service{ + params: p, + featureNgm: p.FeatureFlags.Register("ngm", ">= 5.4.0"), + } lc.Append(fx.Hook{ OnStart: func(ctx context.Context) error { @@ -78,22 +82,21 @@ type InfoResponse struct { // nolint // @Security JwtAuth // @Failure 401 {object} rest.ErrorResponse func (s *Service) infoHandler(c *gin.Context) { - // Checking ngm deployments - // drop "-alpha-xxx" suffix - versionWithoutSuffix := strings.Split(s.params.Config.FeatureVersion, "-")[0] - v, err := semver.NewVersion(versionWithoutSuffix) - if err != nil { - rest.Error(c, err) - return - } - constraint, err := semver.NewConstraint(">= v5.4.0") - if err != nil { - rest.Error(c, err) - return + resp := InfoResponse{ + Version: version.GetInfo(), + EnableTelemetry: s.params.Config.EnableTelemetry, + EnableExperimental: s.params.Config.EnableExperimental, + SupportedFeatures: s.params.FeatureFlags.SupportedFeatures(), + NgmState: s.checkNgmState(), } + c.JSON(http.StatusOK, resp) +} +// Checking ngm deployments. +func (s *Service) checkNgmState() utils.NgmState { ngmState := utils.NgmStateNotSupported - if constraint.Check(v) { + + if s.featureNgm.IsSupported() { ngmState = utils.NgmStateNotStarted addr, err := topology.FetchNgMonitoringTopology(s.lifecycleCtx, s.params.EtcdClient) if err == nil && addr != "" { @@ -101,14 +104,7 @@ func (s *Service) infoHandler(c *gin.Context) { } } - resp := InfoResponse{ - Version: version.GetInfo(), - EnableTelemetry: s.params.Config.EnableTelemetry, - EnableExperimental: s.params.Config.EnableExperimental, - SupportedFeatures: s.params.FeatureFlags.SupportedFeatures(), - NgmState: ngmState, - } - c.JSON(http.StatusOK, resp) + return ngmState } type WhoAmIResponse struct { diff --git a/pkg/apiserver/topsql/service.go b/pkg/apiserver/topsql/service.go index bcd9bdf61b..f85a0d4891 100644 --- a/pkg/apiserver/topsql/service.go +++ b/pkg/apiserver/topsql/service.go @@ -25,20 +25,19 @@ type ServiceParams struct { } type Service struct { - FeatureTopSQL *featureflag.FeatureFlag - - params ServiceParams + params ServiceParams + featureTopSQL *featureflag.FeatureFlag } func newService(p ServiceParams, ff *featureflag.Registry) *Service { - return &Service{params: p, FeatureTopSQL: ff.Register("topsql", ">= 5.4.0")} + return &Service{params: p, featureTopSQL: ff.Register("topsql", ">= 5.4.0")} } func registerRouter(r *gin.RouterGroup, auth *user.AuthService, s *Service) { endpoint := r.Group("/topsql") endpoint.Use( auth.MWAuthRequired(), - s.FeatureTopSQL.VersionGuard(), + s.featureTopSQL.VersionGuard(), utils.MWConnectTiDB(s.params.TiDBClient), ) { diff --git a/pkg/apiserver/user/auth.go b/pkg/apiserver/user/auth.go index af14e2783d..32b7ff405c 100644 --- a/pkg/apiserver/user/auth.go +++ b/pkg/apiserver/user/auth.go @@ -31,7 +31,7 @@ var ( ) type AuthService struct { - FeatureFlagNonRootLogin *featureflag.FeatureFlag + FeatureNonRootLogin *featureflag.FeatureFlag middleware *jwt.GinJWTMiddleware authenticators map[utils.AuthType]Authenticator @@ -91,9 +91,9 @@ func NewAuthService(featureFlags *featureflag.Registry) *AuthService { } service := &AuthService{ - FeatureFlagNonRootLogin: featureFlags.Register("nonRootLogin", ">= 5.3.0"), - middleware: nil, - authenticators: map[utils.AuthType]Authenticator{}, + FeatureNonRootLogin: featureFlags.Register("nonRootLogin", ">= 5.3.0"), + middleware: nil, + authenticators: map[utils.AuthType]Authenticator{}, } middleware, err := jwt.New(&jwt.GinJWTMiddleware{ diff --git a/pkg/config/config.go b/pkg/config/config.go index 71275f1947..d4e4c89945 100755 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -6,8 +6,6 @@ import ( "crypto/tls" "net/url" "strings" - - "github.com/pingcap/tidb-dashboard/pkg/utils/version" ) const ( @@ -29,7 +27,6 @@ type Config struct { EnableTelemetry bool EnableExperimental bool - FeatureVersion string // assign the target TiDB version when running TiDB Dashboard as standalone mode } func Default() *Config { @@ -42,7 +39,6 @@ func Default() *Config { TiDBTLSConfig: nil, EnableTelemetry: true, EnableExperimental: false, - FeatureVersion: version.PDVersion, } } diff --git a/tests/integration/user/user_test.go b/tests/integration/user/user_test.go index fa7023b9ae..a237f800e8 100644 --- a/tests/integration/user/user_test.go +++ b/tests/integration/user/user_test.go @@ -53,7 +53,7 @@ func TestUserSuite(t *testing.T) { } func (s *testUserSuite) supportNonRootLogin() bool { - return s.authService.FeatureFlagNonRootLogin.IsSupported() + return s.authService.FeatureNonRootLogin.IsSupported() } func (s *testUserSuite) SetupSuite() { diff --git a/ui/cypress.json b/ui/cypress.json index 401c84b3ea..49bb2a50a9 100644 --- a/ui/cypress.json +++ b/ui/cypress.json @@ -5,7 +5,7 @@ "screenshotOnRunFailure": false, "video": false, "env": { - "FEATURE_VERSION": "6.0.0", + "PD_VERSION": "6.0.0", "TIDB_VERSION": "nightly" }, "experimentalSessionSupport": true, diff --git a/ui/cypress/README.md b/ui/cypress/README.md index 8f7a3039eb..c1a2df4f86 100644 --- a/ui/cypress/README.md +++ b/ui/cypress/README.md @@ -12,7 +12,7 @@ The Cypress has been added to package.json, so just run `yarn` to install it. We ### Open Test Runner to Run Test Locally -#### Test E2E with FEATURE_VERSION >= 5.3.0 +#### Test E2E with PD_VERSION >= 5.3.0 ```shell # start frontend server @@ -23,15 +23,15 @@ make dev && make run cd ui && yarn open:cypress ``` -#### Test E2E with FEATURE_VERSION < 5.3.0 +#### Test E2E with PD_VERSION < 5.3.0 ```shell # start frontend server cd ui && yarn start # start backend server -make dev && make run FEATURE_VERSION=5.0.0 +make dev && make run PD_VERSION=5.0.0 # open cypress test runner -cd ui && yarn open:cypress --env FEATURE_VERSION=5.0.0 +cd ui && yarn open:cypress --env PD_VERSION=5.0.0 ``` Run test by choosing test file under `/integration` on cypress test runner, cypress will open a broswer to run e2e test. @@ -42,7 +42,7 @@ Run test by choosing test file under `/integration` on cypress test runner, cypr # start frontend server make ui # start backend server -UI=1 make && make run FEATURE_VERSION=${FEATURE_VERSION} +UI=1 make && make run PD_VERSION=${PD_VERSION} # run e2e_compat_features and e2e_common_features tests -make test_e2e FEATURE_VERSION=${FEATURE_VERSION} +make test_e2e PD_VERSION=${PD_VERSION} ``` diff --git a/ui/cypress/integration/login/user_login.compat_spec.js b/ui/cypress/integration/login/user_login.compat_spec.js index 41ff93937f..42ad1ee90d 100644 --- a/ui/cypress/integration/login/user_login.compat_spec.js +++ b/ui/cypress/integration/login/user_login.compat_spec.js @@ -1,10 +1,10 @@ // Copyright 2022 PingCAP, Inc. Licensed under Apache-2.0. // Test User Login Compatibility -// FEATURE_VERSION < 5.3.0 of TiDB Dashboard does not support nonRootLogin -// FEATURE_VERSION >= 5.3.0 of TiDB Dashboard supports nonRootLogin +// PD_VERSION < 5.3.0 of TiDB Dashboard does not support nonRootLogin +// PD_VERSION >= 5.3.0 of TiDB Dashboard supports nonRootLogin describe('User Login', () => { - if (Cypress.env('FEATURE_VERSION') === '6.0.0') { + if (Cypress.env('PD_VERSION') === '6.0.0') { // Create user test before(() => { let queryData = { @@ -35,7 +35,7 @@ describe('User Login', () => { }) it('noRootLogin is supported', () => { - cy.log('FEATURE_VERSION is: ', Cypress.env('FEATURE_VERSION')) + cy.log('PD_VERSION is: ', Cypress.env('PD_VERSION')) // Check username input is not disabled cy.get('[data-e2e=signin_username_input]').should('not.be.disabled') @@ -57,7 +57,7 @@ describe('User Login', () => { expect(response.body).to.have.property('code', 'tidb.tidb_auth_failed') }) }) - } else if (Cypress.env('FEATURE_VERSION') === '5.0.0') { + } else if (Cypress.env('PD_VERSION') === '5.0.0') { beforeEach(() => { cy.fixture('uri.json').then(function (uri) { this.uri = uri @@ -66,7 +66,7 @@ describe('User Login', () => { }) it('noRootLogin is unsupported', () => { - cy.log('FEATURE_VERSION is: ', Cypress.env('FEATURE_VERSION')) + cy.log('PD_VERSION is: ', Cypress.env('PD_VERSION')) // Check username input is disabled cy.get('[data-e2e=signin_username_input]').should('be.disabled')