Skip to content

Commit cd0aaa4

Browse files
authored
Merge pull request #1270 from Oshanath/main
Implement Governance for MCP Servers.
2 parents 2fc3af6 + c075d40 commit cd0aaa4

File tree

12 files changed

+508
-361
lines changed

12 files changed

+508
-361
lines changed

portals/admin/src/main/webapp/site/public/locales/en.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -561,9 +561,10 @@
561561
"Governance.ComplianceDashboard.APICompliance.RulesetAdherence.empty.helper": "No governance rulesets have been applied for this API.",
562562
"Governance.ComplianceDashboard.APICompliance.RulesetAdherence.empty.title": "No Rulesets Found",
563563
"Governance.ComplianceDashboard.APICompliance.RulesetAdherence.violations.tooltip": "Errors: {error}, Warnings: {warn}, Info: {info}",
564-
"Governance.ComplianceDashboard.APICompliance.column.api": "API",
564+
"Governance.ComplianceDashboard.APICompliance.column.artifact": "Artifact",
565565
"Governance.ComplianceDashboard.APICompliance.column.policies": "Policies",
566566
"Governance.ComplianceDashboard.APICompliance.column.status": "Status",
567+
"Governance.ComplianceDashboard.APICompliance.column.type": "Type",
567568
"Governance.ComplianceDashboard.APICompliance.empty.content": "No APIs Available",
568569
"Governance.ComplianceDashboard.APICompliance.empty.helper": "Create APIs to start evaluating their compliance.",
569570
"Governance.ComplianceDashboard.APICompliance.followed.count": "{followed}/{total} Followed",
@@ -599,12 +600,12 @@
599600
"Governance.ComplianceDashboard.PolicyAdherence.empty.content": "No Governance Policies Available",
600601
"Governance.ComplianceDashboard.PolicyAdherence.empty.helper": "Create a new governance policy to start governing the APIs.",
601602
"Governance.ComplianceDashboard.PolicyAdherence.no.apis": "N/A - No APIs to evaluate",
602-
"Governance.ComplianceDashboard.Summary.api.compliance": "API Compliance",
603-
"Governance.ComplianceDashboard.Summary.api.compliance.details": "API Compliance Details",
604603
"Governance.ComplianceDashboard.Summary.api.compliant": "Compliant ({count})",
605604
"Governance.ComplianceDashboard.Summary.api.non.compliant": "Non-Compliant ({count})",
606605
"Governance.ComplianceDashboard.Summary.api.not.applicable": "Not Applicable ({count})",
607606
"Governance.ComplianceDashboard.Summary.api.pending": "Pending ({count})",
607+
"Governance.ComplianceDashboard.Summary.compliance": "Compliance",
608+
"Governance.ComplianceDashboard.Summary.compliance.details": "Compliance Details",
608609
"Governance.ComplianceDashboard.Summary.help.link": "Compliance Monitoring",
609610
"Governance.ComplianceDashboard.Summary.policy.adherence": "Policy Adherence",
610611
"Governance.ComplianceDashboard.Summary.policy.adherence.details": "Policy Adherence Details",

portals/admin/src/main/webapp/site/public/locales/fr.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -561,9 +561,10 @@
561561
"Governance.ComplianceDashboard.APICompliance.RulesetAdherence.empty.helper": "No governance rulesets have been applied for this API.",
562562
"Governance.ComplianceDashboard.APICompliance.RulesetAdherence.empty.title": "No Rulesets Found",
563563
"Governance.ComplianceDashboard.APICompliance.RulesetAdherence.violations.tooltip": "Errors: {error}, Warnings: {warn}, Info: {info}",
564-
"Governance.ComplianceDashboard.APICompliance.column.api": "API",
564+
"Governance.ComplianceDashboard.APICompliance.column.artifact": "Artifact",
565565
"Governance.ComplianceDashboard.APICompliance.column.policies": "Policies",
566566
"Governance.ComplianceDashboard.APICompliance.column.status": "Status",
567+
"Governance.ComplianceDashboard.APICompliance.column.type": "Type",
567568
"Governance.ComplianceDashboard.APICompliance.empty.content": "No APIs Available",
568569
"Governance.ComplianceDashboard.APICompliance.empty.helper": "Create APIs to start evaluating their compliance.",
569570
"Governance.ComplianceDashboard.APICompliance.followed.count": "{followed}/{total} Followed",
@@ -599,12 +600,12 @@
599600
"Governance.ComplianceDashboard.PolicyAdherence.empty.content": "No Governance Policies Available",
600601
"Governance.ComplianceDashboard.PolicyAdherence.empty.helper": "Create a new governance policy to start governing the APIs.",
601602
"Governance.ComplianceDashboard.PolicyAdherence.no.apis": "N/A - No APIs to evaluate",
602-
"Governance.ComplianceDashboard.Summary.api.compliance": "API Compliance",
603-
"Governance.ComplianceDashboard.Summary.api.compliance.details": "API Compliance Details",
604603
"Governance.ComplianceDashboard.Summary.api.compliant": "Compliant ({count})",
605604
"Governance.ComplianceDashboard.Summary.api.non.compliant": "Non-Compliant ({count})",
606605
"Governance.ComplianceDashboard.Summary.api.not.applicable": "Not Applicable ({count})",
607606
"Governance.ComplianceDashboard.Summary.api.pending": "Pending ({count})",
607+
"Governance.ComplianceDashboard.Summary.compliance": "Compliance",
608+
"Governance.ComplianceDashboard.Summary.compliance.details": "Compliance Details",
608609
"Governance.ComplianceDashboard.Summary.help.link": "Compliance Monitoring",
609610
"Governance.ComplianceDashboard.Summary.policy.adherence": "Policy Adherence",
610611
"Governance.ComplianceDashboard.Summary.policy.adherence.details": "Policy Adherence Details",

portals/admin/src/main/webapp/source/src/app/components/Governance/ComplianceDashboard/APICompliance/Compliance.jsx

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ export default function Compliance(props) {
9292
info: 0,
9393
passed: 0,
9494
});
95+
const hasArtifactOwner = Boolean(artifactOwner?.trim());
9596

9697
useEffect(() => {
9798
const abortController = new AbortController();
@@ -238,13 +239,15 @@ export default function Compliance(props) {
238239
defaultMessage='Back to Compliance Dashboard'
239240
/>
240241
</RouterLink>
241-
<Typography variant='body2'>
242-
<FormattedMessage
243-
id='Governance.ComplianceDashboard.Compliance.api.owner'
244-
defaultMessage='API Owner: {owner}'
245-
values={{ owner: artifactOwner }}
246-
/>
247-
</Typography>
242+
{hasArtifactOwner && (
243+
<Typography variant='body2'>
244+
<FormattedMessage
245+
id='Governance.ComplianceDashboard.Compliance.api.owner'
246+
defaultMessage='API Owner: {owner}'
247+
values={{ owner: artifactOwner }}
248+
/>
249+
</Typography>
250+
)}
248251
</Box>
249252
<Card
250253
elevation={3}
@@ -323,13 +326,15 @@ export default function Compliance(props) {
323326
defaultMessage='Back to Compliance Dashboard'
324327
/>
325328
</RouterLink>
326-
<Typography variant='body2'>
327-
<FormattedMessage
328-
id='Governance.ComplianceDashboard.Compliance.api.owner'
329-
defaultMessage='API Owner: {owner}'
330-
values={{ owner: artifactOwner }}
331-
/>
332-
</Typography>
329+
{hasArtifactOwner && (
330+
<Typography variant='body2'>
331+
<FormattedMessage
332+
id='Governance.ComplianceDashboard.Compliance.api.owner'
333+
defaultMessage='API Owner: {owner}'
334+
values={{ owner: artifactOwner }}
335+
/>
336+
</Typography>
337+
)}
333338
</Box>
334339
<Card
335340
elevation={3}
@@ -406,13 +411,15 @@ export default function Compliance(props) {
406411
defaultMessage='Back to Compliance Dashboard'
407412
/>
408413
</RouterLink>
409-
<Typography variant='body2'>
410-
<FormattedMessage
411-
id='Governance.ComplianceDashboard.Compliance.api.owner'
412-
defaultMessage='API Owner: {owner}'
413-
values={{ owner: artifactOwner }}
414-
/>
415-
</Typography>
414+
{hasArtifactOwner && (
415+
<Typography variant='body2'>
416+
<FormattedMessage
417+
id='Governance.ComplianceDashboard.Compliance.api.owner'
418+
defaultMessage='API Owner: {owner}'
419+
values={{ owner: artifactOwner }}
420+
/>
421+
</Typography>
422+
)}
416423
</Box>
417424

418425
<Grid container spacing={4}>

portals/admin/src/main/webapp/source/src/app/components/Governance/ComplianceDashboard/ApiComplianceTable.jsx

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,22 @@ export default function ApiComplianceTable() {
147147
);
148148
};
149149

150+
const renderTypeChip = (type) => {
151+
const typeLabelMap = {
152+
REST_API: 'REST API',
153+
ASYNC_API: 'Async API',
154+
MCP: 'MCP',
155+
};
156+
157+
return (
158+
<Chip
159+
label={typeLabelMap[type] || type || '-'}
160+
size="small"
161+
variant="outlined"
162+
/>
163+
);
164+
};
165+
150166
const columProps = [
151167
{
152168
name: 'id',
@@ -159,8 +175,8 @@ export default function ApiComplianceTable() {
159175
{
160176
name: 'name',
161177
label: intl.formatMessage({
162-
id: 'Governance.ComplianceDashboard.APICompliance.column.api',
163-
defaultMessage: 'API',
178+
id: 'Governance.ComplianceDashboard.APICompliance.column.artifact',
179+
defaultMessage: 'Artifact',
164180
}),
165181
options: {
166182
customBodyRender: (value, tableMeta) => (
@@ -172,8 +188,29 @@ export default function ApiComplianceTable() {
172188
</Box>
173189
),
174190
setCellProps: () => ({
175-
style: { width: '30%' },
191+
style: { width: '20%' },
192+
}),
193+
setCellHeaderProps: () => ({
194+
sx: {
195+
paddingTop: 0,
196+
paddingBottom: 0,
197+
'& .MuiButton-root': {
198+
fontWeight: 'bold',
199+
fontSize: 'small'
200+
},
201+
},
176202
}),
203+
},
204+
},
205+
{
206+
name: 'extendedType',
207+
label: intl.formatMessage({
208+
id: 'Governance.ComplianceDashboard.APICompliance.column.type',
209+
defaultMessage: 'Type',
210+
}),
211+
options: {
212+
customBodyRender: (value, tableMeta) =>
213+
renderTypeChip(tableMeta.rowData[1]?.extendedType || value),
177214
setCellHeaderProps: () => ({
178215
sx: {
179216
paddingTop: 0,
@@ -184,6 +221,9 @@ export default function ApiComplianceTable() {
184221
},
185222
},
186223
}),
224+
setCellProps: () => ({
225+
style: { width: '20%' },
226+
}),
187227
},
188228
},
189229
{
@@ -234,10 +274,10 @@ export default function ApiComplianceTable() {
234274
}),
235275
options: {
236276
customBodyRender: (value, tableMeta) => {
237-
const followed = tableMeta.rowData[4]?.followed || 0;
238-
const violated = tableMeta.rowData[4]?.violated || 0;
277+
const followed = tableMeta.rowData[5]?.followed || 0;
278+
const violated = tableMeta.rowData[5]?.violated || 0;
239279
const total = followed + violated;
240-
const status = tableMeta.rowData[3];
280+
const status = tableMeta.rowData[4];
241281
return renderProgress(followed, total, status);
242282
},
243283
setCellProps: () => ({
@@ -260,7 +300,7 @@ export default function ApiComplianceTable() {
260300
label: ' ',
261301
options: {
262302
customBodyRender: (value, tableMeta) => {
263-
const severityBasedRuleViolationSummary = tableMeta.rowData[5] || [];
303+
const severityBasedRuleViolationSummary = tableMeta.rowData[6] || [];
264304
return renderComplianceIcons(severityBasedRuleViolationSummary);
265305
},
266306
setCellHeaderProps: () => ({

portals/admin/src/main/webapp/source/src/app/components/Governance/ComplianceDashboard/Summary.jsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,8 @@ export default function Summary() {
158158
sx={{ fontWeight: 'bold', mb: 2 }}
159159
>
160160
{intl.formatMessage({
161-
id: 'Governance.ComplianceDashboard.Summary.api.compliance',
162-
defaultMessage: 'API Compliance',
161+
id: 'Governance.ComplianceDashboard.Summary.compliance',
162+
defaultMessage: 'Compliance',
163163
})}
164164
</Typography>
165165
<DonutChart
@@ -220,8 +220,8 @@ export default function Summary() {
220220
sx={{ fontWeight: 'bold', mb: 2 }}
221221
>
222222
{intl.formatMessage({
223-
id: 'Governance.ComplianceDashboard.Summary.api.compliance.details',
224-
defaultMessage: 'API Compliance Details',
223+
id: 'Governance.ComplianceDashboard.Summary.compliance.details',
224+
defaultMessage: 'Compliance Details',
225225
})}
226226
</Typography>
227227
<ApiComplianceTable />

portals/admin/src/main/webapp/source/src/app/data/Constants.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ const CONSTS = {
6262
ARTIFACT_TYPES: [
6363
{ value: 'REST_API', label: 'REST API' },
6464
{ value: 'ASYNC_API', label: 'Async API' },
65+
{ value: 'MCP', label: 'MCP Server' },
6566
],
6667
SEVERITY_LEVELS: [
6768
{ value: 'ERROR', label: 'Error' },

portals/devportal/src/main/webapp/site/public/locales/en.json

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -421,13 +421,12 @@
421421
"Apis.Details.SubTopic.copy.to.clipboard": "Copy to clipboard",
422422
"Apis.Details.Swagger.URL.copied": "Copied",
423423
"Apis.Details.Swagger.URL.copy.to.clipboard": "Copy to clipboard",
424-
"Apis.Details.TryOutConsole.access.token.tooltip": "You can use your existing Access Token or you can generate a new Test Key.",
425-
"Apis.Details.WSDL.URL.copied": "Copied",
426-
"Apis.Details.WSDL.URL.copy.url": "Copy URL",
427-
"Apis.Details.WSDL.view.error": "Something went wrong while retrieving the WSDL.",
428424
"Apis.Details.TryOutConsole.access.token.tooltip": "You can use your existing Access Token or generate a new Test Key.",
429425
"Apis.Details.TryOutConsole.consumer.secret.required": "Consumer Secret is required to generate a new Test Key.",
430426
"Apis.Details.TryOutConsole.consumerSecret.required.helper": "Consumer Secret is required to generate a new Test Key.",
427+
"Apis.Details.WSDL.URL.copied": "Copied",
428+
"Apis.Details.WSDL.URL.copy.url": "Copy URL",
429+
"Apis.Details.WSDL.view.error": "Something went wrong while retrieving the WSDL.",
431430
"Apis.Details.index.api.keys": "API Keys",
432431
"Apis.Details.index.comments": "Comments",
433432
"Apis.Details.index.definition": "Definition",

0 commit comments

Comments
 (0)