Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 1 addition & 16 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,22 +36,7 @@ jobs:
npm run build

- name: Check for broken file references
run: |
cd "${{ matrix.repo }}/build"
echo "Checking for broken files in $(pwd)"

echo "Total files: $(ls -alh . | wc -l)"
echo "Total HTML files: $(find . -type f -name "*.html" | wc -l)"

echo "Ripgrep"
if rg 'file=../../../modules' -g '*.html' | grep -q .; then
echo "Matches found. Exiting with code 0."
rg 'file=../../../modules' -g '*.html'
exit 1
else
echo "No matches found"
exit 0
fi
run: make file-ref-check

prettier:
name: prettier
Expand Down
20 changes: 20 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,26 @@ fmt:
fmt-check:
npx prettier --check --log-level=debug "**/*.md"

.PHONY: build
build:
@echo "Building mission-control documentation..."
@cd modules && make all
@cd mission-control && npm ci && npm run build

.PHONY: file-ref-check
file-ref-check: ## Check for broken file references in build output
@echo "Checking for broken files in mission-control/build"
@cd mission-control/build && \
echo "Total files: $$(ls -alh . | wc -l)" && \
echo "Total HTML files: $$(find . -type f -name "*.html" | wc -l)" && \
if rg 'file=../../../modules' -g '*.html' | grep -q .; then \
echo "ERROR: Found broken file references:" && \
rg 'file=../../../modules' -g '*.html' && \
exit 1; \
else \
echo "No broken file references found"; \
fi

.PHONY:
sync:
git submodule update --init --recursive
Expand Down
196 changes: 113 additions & 83 deletions common/src/components/Fields.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,89 @@ export default function Fields({ common = [], rows = [], oneOf, anyOf, connectio
return a.field.localeCompare(b.field)
}

// Common AWS connection fields
const awsFields = [
{
field: oss ? null : "connection",
description: "The connection url to use, mutually exclusive with `accessKey` and `secretKey`",
scheme: "Connection",
},
{
field: "accessKey",
description: "Access Key ID",
scheme: "EnvVar"
},
{
field: "secretKey",
description: "Secret Access Key",
scheme: "EnvVar"
},
{
field: "region",
description: "The AWS region",
scheme: "string"
},
{
field: "endpoint",
scheme: "string",
description: "Custom AWS Endpoint to use",
},
{
field: "skipTLSVerify",
description: "Skip TLS verify when connecting to AWS",
scheme: 'bool'
}
]

// Common GCP connection fields
const gcpFields = [
{
field: oss ? null : 'connection',
description:
'The connection url to use, mutually exclusive with `credentials`',
scheme: 'Connection'
},
{
field: 'credentials',
description: 'The credentials to use for authentication',
scheme: 'EnvVar'
},
{
field: 'endpoint',
description: 'Custom GCP Endpoint to use',
scheme: 'string'
},
{
field: 'skipTLSVerify',
description: 'Skip TLS verification when connecting to GCP',
scheme: 'bool'
}
]

// Common Azure connection fields
const azureFields = [
{
field: oss ? null : "connection",
description: "The connection url to use, mutually exclusive with `tenantId`, `clientId`, and `clientSecret`",
scheme: "Connection",
},
{
field: "tenantId",
description: "The Azure Active Directory tenant ID",
required: true
},
{
field: "clientId",
description: "The Azure client/application ID",
scheme: "EnvVar"
},
{
field: "clientSecret",
description: "The Azure client/application secret",
scheme: "EnvVar"
}
]

if (connection == "url") {
rows = rows.concat([
{
Expand Down Expand Up @@ -200,62 +283,9 @@ export default function Fields({ common = [], rows = [], oneOf, anyOf, connectio
}
])
} else if (connection == "aws") {
rows = rows.concat([
{
field: oss ? null : "connection",
description: "The connection url to use, mutually exclusive with `accessKey` and `secretKey`",
scheme: "Connection",
},
{
field: "accessKey",
description: "Access Key ID",
scheme: "EnvVar"
},
{
field: "secretKey",
description: "Secret Access Key",
scheme: "EnvVar"
},
{
field: "region",
description: "The AWS region",
scheme: "string"
},
{
field: "endpoint",
scheme: "string",
description: "Custom AWS Endpoint to use",
},
{
field: "skipTLSVerify",
description: "Skip TLS verify when connecting to AWS",
scheme: 'bool'
}
])
rows = rows.concat(awsFields)
} else if (connection == "gcp") {
rows = rows.concat([
{
field: oss ? null : 'connection',
description:
'The connection url to use, mutually exclusive with `credentials`',
scheme: 'Connection'
},
{
field: 'credentials',
description: 'The credentials to use for authentication',
scheme: 'EnvVar'
},
{
field: 'endpoint',
description: 'Custom GCP Endpoint to use',
scheme: 'string'
},
{
field: 'skipTLSVerify',
description: 'Skip TLS verification when connecting to GCP',
scheme: 'bool'
}
])
rows = rows.concat(gcpFields)
} else if (connection == "sftp") {
rows = rows.concat([
{
Expand Down Expand Up @@ -347,34 +377,7 @@ export default function Fields({ common = [], rows = [], oneOf, anyOf, connectio
scheme: "[CNRM](/reference/connections/kubernetes/#cnrm-connection)",
}])
} else if (connection == "azure") {
rows = rows.concat([
{
field: oss ? null : "connection",
description: "The connection url to use, mutually exclusive with `tenantId`, `subscriptionId`, `clientId`, and `clientSecret`",
scheme: "Connection",
},
{
field: "tenantId",
description: "The Azure Active Directory tenant ID",
required: true
},
{
field: "subscriptionId",
description: "The Azure subscription ID",
required: true,
scheme: "EnvVar"
},
{
field: "clientId",
description: "The Azure client/application ID",
scheme: "EnvVar"
},
{
field: "clientSecret",
description: "The Azure client/application secret",
scheme: "EnvVar"
}
])
rows = rows.concat(azureFields)
} else if (connection == "openai") {
rows = rows.concat([
{
Expand Down Expand Up @@ -618,6 +621,33 @@ export default function Fields({ common = [], rows = [], oneOf, anyOf, connectio
} else if (connection == "prometheus") {
// Prometheus extends HTTP connection, so HTTP fields will be included
rows = rows.concat([])
} else if (connection == "aws_kms") {
rows = rows.concat(awsFields.concat([
{
field: "keyID",
description: "KMS key ID, alias, or ARN. Can include region specification for aliases (e.g., alias/ExampleAlias?region=us-east-1)",
scheme: "string",
required: true
}
]))
} else if (connection == "gcp_kms") {
rows = rows.concat(gcpFields.concat([
{
field: "keyID",
description: "KMS key resource path in the format: projects/PROJECT/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY",
scheme: "string",
required: true
}
]))
} else if (connection == "azure_key_vault") {
rows = rows.concat(azureFields.concat([
{
field: "keyID",
description: "Key Vault key URL in the format: https://vault-name.vault.azure.net/keys/key-name",
scheme: "string",
required: true
}
]))
}

rows = rows.concat(common.filter(row => row.required)).filter(i => i.field != null)
Expand Down
43 changes: 43 additions & 0 deletions mission-control/docs/guide/playbooks/concepts/sensitive-data.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
---
title: Sensitive Data
sidebar_custom_props:
icon: material-symbols-light:security
---

Sensitive data includes passwords, API keys, tokens, and other confidential information that requires protection from unauthorized access or exposure. Mission Control provides comprehensive protection for sensitive data throughout the entire playbook lifecycle.

## Secret Parameters

Use `secret` type parameters to handle sensitive data in playbooks:

```yaml
parameters:
- name: database_password
type: secret
label: "Database Password"
description: "Password for database connection"
required: true
```

## KMS Connection

:::info
Your Mission Control instance **must** have a KMS connection configured to use secret parameters.
:::

Configure this using the `--secret-keeper-connection` flag:

```bash
mission-control serve --secret-keeper-connection "connection://default/my-kms-key"
```

or in the helm chart:

```yaml
kmsConnection: "connection://default/my-kms-key"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we update the setup guides for AWS/GCP for the creation of this key, and connection and the updates to the IAM binding needed.

This is also I think a post-setup task as it requires the ability to create the connection first

```

Supported connection types:
- AWS KMS
- Azure Key Vault
- GCP KMS
Loading