44 * you may not use this file except in compliance with the Elastic License.
55 */
66import React , { useState } from 'react' ;
7+ import { i18n } from '@kbn/i18n' ;
78import { FormattedMessage } from '@kbn/i18n/react' ;
89import {
910 EuiPageBody ,
@@ -14,11 +15,39 @@ import {
1415 EuiTitle ,
1516 EuiSpacer ,
1617 EuiIcon ,
18+ EuiCallOut ,
19+ EuiFlexItem ,
20+ EuiFlexGroup ,
21+ EuiCode ,
22+ EuiCodeBlock ,
23+ EuiLink ,
1724} from '@elastic/eui' ;
1825import { useCore , sendPostFleetSetup } from '../../../hooks' ;
1926import { WithoutHeaderLayout } from '../../../layouts' ;
2027import { GetFleetStatusResponse } from '../../../types' ;
2128
29+ export const RequirementItem : React . FunctionComponent < { isMissing : boolean } > = ( {
30+ isMissing,
31+ children,
32+ } ) => {
33+ return (
34+ < EuiFlexGroup gutterSize = "s" alignItems = "flexStart" >
35+ < EuiFlexItem grow = { false } >
36+ < EuiText >
37+ { isMissing ? (
38+ < EuiIcon type = "crossInACircleFilled" color = "danger" />
39+ ) : (
40+ < EuiIcon type = "checkInCircleFilled" color = "success" />
41+ ) }
42+ </ EuiText >
43+ </ EuiFlexItem >
44+ < EuiFlexItem grow = { false } >
45+ < EuiText > { children } </ EuiText >
46+ </ EuiFlexItem >
47+ </ EuiFlexGroup >
48+ ) ;
49+ } ;
50+
2251export const SetupPage : React . FunctionComponent < {
2352 refresh : ( ) => Promise < void > ;
2453 missingRequirements : GetFleetStatusResponse [ 'missing_requirements' ] ;
@@ -38,84 +67,154 @@ export const SetupPage: React.FunctionComponent<{
3867 }
3968 } ;
4069
41- const content =
42- missingRequirements . includes ( 'tls_required' ) ||
43- missingRequirements . includes ( 'api_keys' ) ||
44- missingRequirements . includes ( 'encrypted_saved_object_encryption_key_required' ) ? (
45- < >
46- < EuiSpacer size = "m" />
47- < EuiIcon type = "lock" color = "subdued" size = "xl" />
48- < EuiSpacer size = "m" />
49- < EuiTitle size = "l" >
50- < h2 >
70+ if (
71+ ! missingRequirements . includes ( 'tls_required' ) &&
72+ ! missingRequirements . includes ( 'api_keys' ) &&
73+ ! missingRequirements . includes ( 'encrypted_saved_object_encryption_key_required' )
74+ ) {
75+ return (
76+ < WithoutHeaderLayout >
77+ < EuiPageBody restrictWidth = { 548 } >
78+ < EuiPageContent
79+ verticalPosition = "center"
80+ horizontalPosition = "center"
81+ className = "eui-textCenter"
82+ paddingSize = "l"
83+ >
84+ < EuiSpacer size = "m" />
85+ < EuiIcon type = "lock" color = "subdued" size = "xl" />
86+ < EuiSpacer size = "m" />
87+ < EuiTitle size = "l" >
88+ < h2 >
89+ < FormattedMessage
90+ id = "xpack.ingestManager.setupPage.enableTitle"
91+ defaultMessage = "Enable Fleet"
92+ />
93+ </ h2 >
94+ </ EuiTitle >
95+ < EuiSpacer size = "xl" />
96+ < EuiText color = "subdued" >
97+ < FormattedMessage
98+ id = "xpack.ingestManager.setupPage.enableText"
99+ defaultMessage = "In order to use Fleet, you must create an Elastic user. This user can create API keys
100+ and write to logs-* and metrics-*."
101+ />
102+ </ EuiText >
103+ < EuiSpacer size = "l" />
104+ < EuiForm >
105+ < form onSubmit = { onSubmit } >
106+ < EuiButton fill isLoading = { isFormLoading } type = "submit" >
107+ < FormattedMessage
108+ id = "xpack.ingestManager.setupPage.enableFleet"
109+ defaultMessage = "Create user and enable Fleet"
110+ />
111+ </ EuiButton >
112+ </ form >
113+ </ EuiForm >
114+ < EuiSpacer size = "m" />
115+ </ EuiPageContent >
116+ </ EuiPageBody >
117+ </ WithoutHeaderLayout >
118+ ) ;
119+ }
120+
121+ return (
122+ < WithoutHeaderLayout >
123+ < EuiPageBody restrictWidth = { 820 } >
124+ < EuiPageContent >
125+ < EuiCallOut
126+ title = { i18n . translate ( 'xpack.ingestManager.setupPage.missingRequirementsCalloutTitle' , {
127+ defaultMessage : 'Missing security requirements' ,
128+ } ) }
129+ color = "warning"
130+ iconType = "alert"
131+ >
51132 < FormattedMessage
52- id = "xpack.ingestManager.setupPage.missingRequirementsTitle "
53- defaultMessage = "Missing requirements "
133+ id = "xpack.ingestManager.setupPage.missingRequirementsCalloutDescription "
134+ defaultMessage = "In order to use Fleet, you must enable the following Elasticsearch and Kibana security features. "
54135 />
55- </ h2 >
56- </ EuiTitle >
57- < EuiSpacer size = "xl" />
58- < EuiText color = "subdued" textAlign = { 'left' } >
136+ </ EuiCallOut >
137+ < EuiSpacer size = "m" />
59138 < FormattedMessage
60- id = "xpack.ingestManager.setupPage.missingRequirementsDescription"
61- defaultMessage = "To use Fleet, you must enable the following features:
62- {space}- Enable Elasticsearch API keys.
63- {space}- Enable TLS to secure the communication between Agents and Kibana.
64- {space}- Set the encryption key for encrypted saved objects.
65- "
66- values = { {
67- space : < EuiSpacer size = "m" /> ,
68- } }
139+ id = "xpack.ingestManager.setupPage.missingRequirementsElasticsearchTitle"
140+ defaultMessage = "In your Elasticsearch configuration, enable:"
69141 />
70- </ EuiText >
71- < EuiSpacer size = "l" />
72- </ >
73- ) : (
74- < >
75- < EuiSpacer size = "m" />
76- < EuiIcon type = "lock" color = "subdued" size = "xl" />
77- < EuiSpacer size = "m" />
78- < EuiTitle size = "l" >
79- < h2 >
142+ < EuiSpacer size = "l" />
143+ < RequirementItem isMissing = { false } >
144+ < FormattedMessage
145+ id = "xpack.ingestManager.setupPage.elasticsearchSecurityFlagText"
146+ defaultMessage = "Elasticsearch security. Set {securityFlag} to {true} ."
147+ values = { {
148+ securityFlag : < EuiCode > xpack.security.enabled</ EuiCode > ,
149+ true : < EuiCode > true</ EuiCode > ,
150+ } }
151+ />
152+ </ RequirementItem >
153+ < EuiSpacer size = "s" />
154+ < RequirementItem isMissing = { missingRequirements . includes ( 'api_keys' ) } >
80155 < FormattedMessage
81- id = "xpack.ingestManager.setupPage.enableTitle"
82- defaultMessage = "Enable Fleet"
156+ id = "xpack.ingestManager.setupPage.elasticsearchApiKeyFlagText"
157+ defaultMessage = "API key service. Set {apiKeyFlag} to {true} ."
158+ values = { {
159+ apiKeyFlag : < EuiCode > xpack.security.authc.api_key.enabled</ EuiCode > ,
160+ true : < EuiCode > true</ EuiCode > ,
161+ } }
83162 />
84- </ h2 >
85- </ EuiTitle >
86- < EuiSpacer size = "xl" />
87- < EuiText color = "subdued" >
163+ </ RequirementItem >
164+ < EuiSpacer size = "m" />
165+ < EuiCodeBlock isCopyable = { true } >
166+ { `xpack.security.enabled: true
167+ xpack.security.authc.api_key.enabled: true` }
168+ </ EuiCodeBlock >
169+ < EuiSpacer size = "l" />
88170 < FormattedMessage
89- id = "xpack.ingestManager.setupPage.enableText"
90- defaultMessage = "In order to use Fleet, you must create an Elastic user. This user can create API keys
91- and write to logs-* and metrics-*."
171+ id = "xpack.ingestManager.setupPage.missingRequirementsKibanaTitle"
172+ defaultMessage = "In your Kibana configuration, enable:"
173+ />
174+ < EuiSpacer size = "l" />
175+ < RequirementItem isMissing = { missingRequirements . includes ( 'tls_required' ) } >
176+ < FormattedMessage
177+ id = "xpack.ingestManager.setupPage.tlsFlagText"
178+ defaultMessage = "Kibana security. Set. Set {securityFlag} to {true}. For development purposes, you can disable TLS by setting {tlsFlag} to {true} as an unsafe alternative."
179+ values = { {
180+ securityFlag : < EuiCode > xpack.security.enabled</ EuiCode > ,
181+ tlsFlag : < EuiCode > xpack.ingestManager.fleet.tlsCheckDisabled</ EuiCode > ,
182+ true : < EuiCode > true</ EuiCode > ,
183+ } }
184+ />
185+ </ RequirementItem >
186+ < EuiSpacer size = "m" />
187+ < RequirementItem
188+ isMissing = { missingRequirements . includes (
189+ 'encrypted_saved_object_encryption_key_required'
190+ ) }
191+ >
192+ < FormattedMessage
193+ id = "xpack.ingestManager.setupPage.encryptionKeyFlagText"
194+ defaultMessage = "Encryption key. Set {keyFlag} to use a secret key."
195+ values = { {
196+ keyFlag : < EuiCode > xpack.reporting.encryptionKey</ EuiCode > ,
197+ } }
198+ />
199+ </ RequirementItem >
200+ < EuiSpacer size = "l" />
201+ < FormattedMessage
202+ id = "xpack.ingestManager.setupPage.gettingStartedText"
203+ defaultMessage = "For more information, read our {link}."
204+ values = { {
205+ link : (
206+ < EuiLink
207+ href = "https://www.elastic.co/guide/en/ingest-management/current/index.html"
208+ target = "_blank"
209+ >
210+ < FormattedMessage
211+ id = "xpack.ingestManager.setupPage.gettingStartedLink"
212+ defaultMessage = "Getting Started"
213+ />
214+ </ EuiLink >
215+ ) ,
216+ } }
92217 />
93- </ EuiText >
94- < EuiSpacer size = "l" />
95- < EuiForm >
96- < form onSubmit = { onSubmit } >
97- < EuiButton fill isLoading = { isFormLoading } type = "submit" >
98- < FormattedMessage
99- id = "xpack.ingestManager.setupPage.enableFleet"
100- defaultMessage = "Create user and enable Fleet"
101- />
102- </ EuiButton >
103- </ form >
104- </ EuiForm >
105- < EuiSpacer size = "m" />
106- </ >
107- ) ;
108-
109- return (
110- < WithoutHeaderLayout >
111- < EuiPageBody restrictWidth = { 548 } >
112- < EuiPageContent
113- verticalPosition = "center"
114- horizontalPosition = "center"
115- className = "eui-textCenter"
116- paddingSize = "l"
117- >
118- { content }
119218 </ EuiPageContent >
120219 </ EuiPageBody >
121220 </ WithoutHeaderLayout >
0 commit comments