Skip to content

Commit 2a0f5a0

Browse files
authored
Allow hiding assume role inputs (#126)
1 parent cffaa13 commit 2a0f5a0

File tree

3 files changed

+102
-86
lines changed

3 files changed

+102
-86
lines changed

src/components/ConnectionConfig.test.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,12 @@ describe('ConnectionConfig', () => {
158158
expect(screen.queryByText('Assume Role ARN')).not.toBeInTheDocument();
159159
});
160160

161+
it('should not render assume role input if hideAssumeRoleArn set to true', () => {
162+
const props = getProps();
163+
render(<ConnectionConfig {...props} hideAssumeRoleArn />);
164+
expect(screen.queryByText('Assume Role ARN')).not.toBeInTheDocument();
165+
});
166+
161167
it('should render assume role input by default if awsAssumeRoleEnabled is not defined in the config', () => {
162168
const props = getProps();
163169
render(<ConnectionConfig {...props} />);

src/components/ConnectionConfig.tsx

Lines changed: 95 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,14 @@ const isAwsAuthType = (value: any): value is AwsAuthType => {
2323
export const ConnectionConfig: FC<ConnectionConfigProps> = (props: ConnectionConfigProps) => {
2424
const [isARNInstructionsOpen, setIsARNInstructionsOpen] = useState(false);
2525
const [regions, setRegions] = useState((props.standardRegions || standardRegions).map(toOption));
26-
const { loadRegions, onOptionsChange, skipHeader = false, skipEndpoint = false, options } = props;
26+
const {
27+
loadRegions,
28+
onOptionsChange,
29+
skipHeader = false,
30+
skipEndpoint = false,
31+
options,
32+
hideAssumeRoleArn = false,
33+
} = props;
2734
let profile = options.jsonData.profile;
2835
if (profile === undefined) {
2936
profile = options.database;
@@ -142,97 +149,99 @@ export const ConnectionConfig: FC<ConnectionConfigProps> = (props: ConnectionCon
142149
)}
143150
</ConfigSubSection>
144151

145-
<ConfigSubSection title="Assume Role">
146-
{options.jsonData.authType === AwsAuthType.GrafanaAssumeRole && (
147-
<div className={assumeRoleInstructionsStyle}>
148-
<Collapse
149-
label={'How to create an IAM role for grafana to assume:'}
150-
collapsible={true}
151-
isOpen={isARNInstructionsOpen}
152-
onToggle={() => setIsARNInstructionsOpen(!isARNInstructionsOpen)}
153-
>
154-
<ol>
155-
<li>
156-
<p>
157-
1. Create a new IAM role in the AWS console, and select <code>Another AWS account</code> as the{' '}
158-
<code>Trusted entity</code>.
159-
</p>
160-
</li>
161-
<li>
162-
<p>
163-
2. Enter the account ID of the Grafana account that has permission to assume this role:
164-
<code> 008923505280 </code> and check the <code>Require external ID</code> box.
165-
</p>
166-
</li>
167-
<li>
168-
<p>
169-
3. Enter the following external ID:{' '}
170-
<code>{props.externalId || 'External Id is currently unavailable'}</code> and click{' '}
171-
<code>Next</code>.
172-
</p>
173-
</li>
174-
<li>
175-
<p>
176-
4. Add any required permissions you would like Grafana to be able to access on your behalf. For
177-
more details on our permissions please{' '}
178-
<a
179-
href="https://grafana.com/docs/grafana/latest/datasources/aws-cloudwatch/"
180-
target="_blank"
181-
rel="noreferrer"
182-
>
183-
read through our documentation
184-
</a>
185-
.
186-
</p>
187-
</li>
188-
<li>
189-
<p>
190-
5. Give the role a name and description, and click <code>Create role</code>.
191-
</p>
192-
</li>
193-
<li>
194-
<p>
195-
6. Copy the ARN of the role you just created and paste it into the <code>Assume Role ARN</code>{' '}
196-
field below.
197-
</p>
198-
</li>
199-
</ol>
200-
</Collapse>
201-
</div>
202-
)}
203-
{awsAssumeRoleEnabled && (
204-
<>
205-
<Field
206-
htmlFor="assumeRoleArn"
207-
label="Assume Role ARN"
208-
description="Optional. Specifying the ARN of a role will ensure that the
152+
{!hideAssumeRoleArn && (
153+
<ConfigSubSection title="Assume Role">
154+
{options.jsonData.authType === AwsAuthType.GrafanaAssumeRole && (
155+
<div className={assumeRoleInstructionsStyle}>
156+
<Collapse
157+
label={'How to create an IAM role for grafana to assume:'}
158+
collapsible={true}
159+
isOpen={isARNInstructionsOpen}
160+
onToggle={() => setIsARNInstructionsOpen(!isARNInstructionsOpen)}
161+
>
162+
<ol>
163+
<li>
164+
<p>
165+
1. Create a new IAM role in the AWS console, and select <code>Another AWS account</code> as the{' '}
166+
<code>Trusted entity</code>.
167+
</p>
168+
</li>
169+
<li>
170+
<p>
171+
2. Enter the account ID of the Grafana account that has permission to assume this role:
172+
<code> 008923505280 </code> and check the <code>Require external ID</code> box.
173+
</p>
174+
</li>
175+
<li>
176+
<p>
177+
3. Enter the following external ID:{' '}
178+
<code>{props.externalId || 'External Id is currently unavailable'}</code> and click{' '}
179+
<code>Next</code>.
180+
</p>
181+
</li>
182+
<li>
183+
<p>
184+
4. Add any required permissions you would like Grafana to be able to access on your behalf. For
185+
more details on our permissions please{' '}
186+
<a
187+
href="https://grafana.com/docs/grafana/latest/datasources/aws-cloudwatch/"
188+
target="_blank"
189+
rel="noreferrer"
190+
>
191+
read through our documentation
192+
</a>
193+
.
194+
</p>
195+
</li>
196+
<li>
197+
<p>
198+
5. Give the role a name and description, and click <code>Create role</code>.
199+
</p>
200+
</li>
201+
<li>
202+
<p>
203+
6. Copy the ARN of the role you just created and paste it into the <code>Assume Role ARN</code>{' '}
204+
field below.
205+
</p>
206+
</li>
207+
</ol>
208+
</Collapse>
209+
</div>
210+
)}
211+
{awsAssumeRoleEnabled && (
212+
<>
213+
<Field
214+
htmlFor="assumeRoleArn"
215+
label="Assume Role ARN"
216+
description="Optional. Specifying the ARN of a role will ensure that the
209217
selected authentication provider is used to assume the role rather than the
210218
credentials directly."
211-
>
212-
<Input
213-
id="assumeRoleArn"
214-
placeholder="arn:aws:iam:*"
215-
value={options.jsonData.assumeRoleArn || ''}
216-
onChange={onUpdateDatasourceJsonDataOption(props, 'assumeRoleArn')}
217-
/>
218-
</Field>
219-
{options.jsonData.authType !== AwsAuthType.GrafanaAssumeRole && (
220-
<Field
221-
htmlFor="externalId"
222-
label="External ID"
223-
description="If you are assuming a role in another account, that has been created with an external ID, specify the external ID here."
224219
>
225220
<Input
226-
id="externalId"
227-
placeholder="External ID"
228-
value={options.jsonData.externalId || ''}
229-
onChange={onUpdateDatasourceJsonDataOption(props, 'externalId')}
221+
id="assumeRoleArn"
222+
placeholder="arn:aws:iam:*"
223+
value={options.jsonData.assumeRoleArn || ''}
224+
onChange={onUpdateDatasourceJsonDataOption(props, 'assumeRoleArn')}
230225
/>
231226
</Field>
232-
)}
233-
</>
234-
)}
235-
</ConfigSubSection>
227+
{options.jsonData.authType !== AwsAuthType.GrafanaAssumeRole && (
228+
<Field
229+
htmlFor="externalId"
230+
label="External ID"
231+
description="If you are assuming a role in another account, that has been created with an external ID, specify the external ID here."
232+
>
233+
<Input
234+
id="externalId"
235+
placeholder="External ID"
236+
value={options.jsonData.externalId || ''}
237+
onChange={onUpdateDatasourceJsonDataOption(props, 'externalId')}
238+
/>
239+
</Field>
240+
)}
241+
</>
242+
)}
243+
</ConfigSubSection>
244+
)}
236245
<ConfigSubSection title="Additional Settings">
237246
{!skipEndpoint && options.jsonData.authType !== AwsAuthType.GrafanaAssumeRole && (
238247
<Field

src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,5 @@ export interface ConnectionConfigProps<
4242
labelWidth?: number;
4343
inExperimentalAuthComponent?: boolean;
4444
externalId?: string;
45+
hideAssumeRoleArn?: boolean;
4546
}

0 commit comments

Comments
 (0)