From 08ea069ed45e094a68d8b84e8202a87c3b1d3167 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Tue, 6 Dec 2022 09:53:01 -0800 Subject: [PATCH] change doc URL if UI is running in k8s (#2484) Co-authored-by: Prakash Senthil Vel <23444145+prakashsvmx@users.noreply.github.com> --- models/login_details.go | 3 +++ operatorapi/embedded_spec.go | 6 ++++++ operatorapi/login.go | 11 +++++++++++ portal-ui/src/screens/LoginPage/LoginPage.tsx | 17 ++++++++++------- portal-ui/src/screens/LoginPage/loginSlice.ts | 3 +++ portal-ui/src/screens/LoginPage/types.ts | 1 + restapi/embedded_spec.go | 6 ++++++ restapi/user_login.go | 11 +++++++++++ swagger-console.yml | 2 ++ swagger-operator.yml | 2 ++ 10 files changed, 55 insertions(+), 7 deletions(-) diff --git a/models/login_details.go b/models/login_details.go index b703f8a2e..b9dfac608 100644 --- a/models/login_details.go +++ b/models/login_details.go @@ -41,6 +41,9 @@ type LoginDetails struct { // is direct p v IsDirectPV bool `json:"isDirectPV,omitempty"` + // is k8 s + IsK8S bool `json:"isK8S,omitempty"` + // login strategy // Enum: [form redirect service-account redirect-service-account] LoginStrategy string `json:"loginStrategy,omitempty"` diff --git a/operatorapi/embedded_spec.go b/operatorapi/embedded_spec.go index 975b6bdbe..5bae518c4 100644 --- a/operatorapi/embedded_spec.go +++ b/operatorapi/embedded_spec.go @@ -3626,6 +3626,9 @@ func init() { "isDirectPV": { "type": "boolean" }, + "isK8S": { + "type": "boolean" + }, "loginStrategy": { "type": "string", "enum": [ @@ -9622,6 +9625,9 @@ func init() { "isDirectPV": { "type": "boolean" }, + "isK8S": { + "type": "boolean" + }, "loginStrategy": { "type": "string", "enum": [ diff --git a/operatorapi/login.go b/operatorapi/login.go index 669e51393..6ea7f554d 100644 --- a/operatorapi/login.go +++ b/operatorapi/login.go @@ -25,6 +25,7 @@ import ( xoauth2 "golang.org/x/oauth2" "github.com/minio/minio-go/v7/pkg/credentials" + "github.com/minio/pkg/env" "github.com/minio/console/restapi" @@ -93,6 +94,15 @@ func login(credentials restapi.ConsoleCredentialsI) (*string, error) { return &token, nil } +// isKubernetes returns true if minio is running in kubernetes. +func isKubernetes() bool { + // Kubernetes env used to validate if we are + // indeed running inside a kubernetes pod + // is KUBERNETES_SERVICE_HOST + // https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/kubelet_pods.go#L541 + return env.Get("KUBERNETES_SERVICE_HOST", "") != "" +} + // getLoginDetailsResponse returns information regarding the Console authentication mechanism. func getLoginDetailsResponse(params authApi.LoginDetailParams) (*models.LoginDetails, *models.Error) { ctx, cancel := context.WithCancel(params.HTTPRequest.Context()) @@ -129,6 +139,7 @@ func getLoginDetailsResponse(params authApi.LoginDetailParams) (*models.LoginDet LoginStrategy: loginStrategy, RedirectRules: redirectRules, IsDirectPV: getDirectPVEnabled(), + IsK8S: isKubernetes(), } return loginDetails, nil } diff --git a/portal-ui/src/screens/LoginPage/LoginPage.tsx b/portal-ui/src/screens/LoginPage/LoginPage.tsx index bccaac77e..d1ab66567 100644 --- a/portal-ui/src/screens/LoginPage/LoginPage.tsx +++ b/portal-ui/src/screens/LoginPage/LoginPage.tsx @@ -291,7 +291,8 @@ const Login = () => { ); const navigateTo = useSelector((state: AppState) => state.login.navigateTo); - const directPVMode = useSelector((state: AppState) => state.login.isDirectPV); + const isDirectPV = useSelector((state: AppState) => state.login.isDirectPV); + const isK8S = useSelector((state: AppState) => state.login.isK8S); const isOperator = loginStrategy.loginStrategy === loginStrategyType.serviceAccount || @@ -479,12 +480,18 @@ const Login = () => { let modeLogo: "console" | "directpv" | "operator" | "kes" | "subnet" = "console"; - if (directPVMode) { + if (isDirectPV) { modeLogo = "directpv"; } else if (isOperator) { modeLogo = "operator"; } + let docsURL = "https://min.io/docs/minio/linux/index.html?ref=con"; + if (isK8S) { + docsURL = + "https://min.io/docs/minio/kubernetes/upstream/index.html?ref=con"; + } + return ( @@ -493,11 +500,7 @@ const Login = () => { form={loginComponent} formFooter={ - + Documentation | diff --git a/portal-ui/src/screens/LoginPage/loginSlice.ts b/portal-ui/src/screens/LoginPage/loginSlice.ts index b11803fa1..f091e219f 100644 --- a/portal-ui/src/screens/LoginPage/loginSlice.ts +++ b/portal-ui/src/screens/LoginPage/loginSlice.ts @@ -38,6 +38,7 @@ export interface LoginState { latestMinIOVersion: string; loadingVersion: boolean; isDirectPV: boolean; + isK8S: boolean; navigateTo: string; } @@ -57,6 +58,7 @@ const initialState: LoginState = { latestMinIOVersion: "", loadingVersion: true, isDirectPV: false, + isK8S: false, navigateTo: "", }; @@ -110,6 +112,7 @@ export const loginSlice = createSlice({ if (action.payload) { state.loginStrategy = action.payload; state.isDirectPV = !!action.payload.isDirectPV; + state.isK8S = !!action.payload.isK8S; } }) .addCase(doLoginAsync.pending, (state, action) => { diff --git a/portal-ui/src/screens/LoginPage/types.ts b/portal-ui/src/screens/LoginPage/types.ts index 1e6e93716..e7577b13f 100644 --- a/portal-ui/src/screens/LoginPage/types.ts +++ b/portal-ui/src/screens/LoginPage/types.ts @@ -18,6 +18,7 @@ export interface ILoginDetails { loginStrategy: loginStrategyType; redirectRules: redirectRule[]; isDirectPV?: boolean; + isK8S?: boolean; } export interface redirectRule { diff --git a/restapi/embedded_spec.go b/restapi/embedded_spec.go index 649a29b02..a6172188b 100644 --- a/restapi/embedded_spec.go +++ b/restapi/embedded_spec.go @@ -6379,6 +6379,9 @@ func init() { "isDirectPV": { "type": "boolean" }, + "isK8S": { + "type": "boolean" + }, "loginStrategy": { "type": "string", "enum": [ @@ -14681,6 +14684,9 @@ func init() { "isDirectPV": { "type": "boolean" }, + "isK8S": { + "type": "boolean" + }, "loginStrategy": { "type": "string", "enum": [ diff --git a/restapi/user_login.go b/restapi/user_login.go index bd44a9d28..c49bb6821 100644 --- a/restapi/user_login.go +++ b/restapi/user_login.go @@ -31,6 +31,7 @@ import ( authApi "github.com/minio/console/restapi/operations/auth" "github.com/minio/madmin-go/v2" "github.com/minio/minio-go/v7/pkg/credentials" + "github.com/minio/pkg/env" ) func registerLoginHandlers(api *operations.ConsoleAPI) { @@ -153,6 +154,15 @@ func getLoginResponse(params authApi.LoginParams) (*models.LoginResponse, *model return loginResponse, nil } +// isKubernetes returns true if minio is running in kubernetes. +func isKubernetes() bool { + // Kubernetes env used to validate if we are + // indeed running inside a kubernetes pod + // is KUBERNETES_SERVICE_HOST + // https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/kubelet_pods.go#L541 + return env.Get("KUBERNETES_SERVICE_HOST", "") != "" +} + // getLoginDetailsResponse returns information regarding the Console authentication mechanism. func getLoginDetailsResponse(params authApi.LoginDetailParams, openIDProviders oauth2.OpenIDPCfg) (*models.LoginDetails, *models.Error) { ctx, cancel := context.WithCancel(params.HTTPRequest.Context()) @@ -193,6 +203,7 @@ func getLoginDetailsResponse(params authApi.LoginDetailParams, openIDProviders o loginDetails = &models.LoginDetails{ LoginStrategy: loginStrategy, RedirectRules: redirectRules, + IsK8S: isKubernetes(), } return loginDetails, nil } diff --git a/swagger-console.yml b/swagger-console.yml index 9a67a87b0..932152635 100644 --- a/swagger-console.yml +++ b/swagger-console.yml @@ -4057,6 +4057,8 @@ definitions: $ref: "#/definitions/redirectRule" isDirectPV: type: boolean + isK8S: + type: boolean loginOauth2AuthRequest: type: object required: diff --git a/swagger-operator.yml b/swagger-operator.yml index 727020e53..902ca9755 100644 --- a/swagger-operator.yml +++ b/swagger-operator.yml @@ -1645,6 +1645,8 @@ definitions: $ref: "#/definitions/redirectRule" isDirectPV: type: boolean + isK8S: + type: boolean loginRequest: type: object properties: