@nuvlore/extension-bds 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +3 -0
- package/agents/bds-airflow-job-status-readonly.yaml +123 -0
- package/agents/bds-disk-investigator.yaml +112 -0
- package/agents/bds-inventory-readonly.yaml +60 -0
- package/agents/bds-oncall-reporter.yaml +113 -0
- package/agents/bds-prism-service-proxy-timeout-readonly.yaml +105 -0
- package/agents/bds-scylla-tenant-bucket-readonly.yaml +104 -0
- package/agents/bds-tenant-data-operation-log-readonly.yaml +98 -0
- package/agents/bds-yarn-app-health-readonly.yaml +114 -0
- package/agents/pharos-alert-investigator.yaml +81 -0
- package/package.json +60 -0
- package/skills/bds-airflow-job-status-investigation/SKILL.md +104 -0
- package/skills/bds-airflow-job-status-investigation/references/airflow-access-runbook.md +35 -0
- package/skills/bds-airflow-job-status-investigation/references/airflow-bas-dr-runbook.md +42 -0
- package/skills/bds-airflow-job-status-investigation/references/airflow-copy-and-migration-runbook.md +63 -0
- package/skills/bds-airflow-job-status-investigation/references/airflow-job-status-runbook.md +15 -0
- package/skills/bds-airflow-job-status-investigation/references/airflow-output-runbook.md +28 -0
- package/skills/bds-airflow-job-status-investigation/references/airflow-snapshot-runbook.md +38 -0
- package/skills/bds-disk-io-alert-investigation/SKILL.md +116 -0
- package/skills/bds-hadoop-review/SKILL.md +66 -0
- package/skills/bds-machine-inventory/SKILL.md +48 -0
- package/skills/bds-oncall-followup/SKILL.md +71 -0
- package/skills/bds-oncall-followup/references/oncall-followup-runbook.md +58 -0
- package/skills/bds-prism-service-proxy-timeout-investigation/SKILL.md +73 -0
- package/skills/bds-prism-service-proxy-timeout-investigation/references/service-proxy-timeout-runbook.md +48 -0
- package/skills/bds-scylla-tenant-bucket-investigation/SKILL.md +73 -0
- package/skills/bds-scylla-tenant-bucket-investigation/references/tenant-bucket-runbook.md +91 -0
- package/skills/bds-tenant-data-operation-log-investigation/SKILL.md +89 -0
- package/skills/bds-yarn-app-health-investigation/SKILL.md +77 -0
- package/skills/bds-yarn-app-health-investigation/references/yarn-app-health-runbook.md +53 -0
- package/skills/pharos-alert-investigation/SKILL.md +80 -0
- package/src/bds-atomic-log-tools.mjs +300 -0
- package/src/bds-team-membership-claude-output.mjs +36 -0
- package/src/bds-team-membership-quality.mjs +90 -0
- package/tools/bds_airflow_dag_log_read.mjs +24 -0
- package/tools/bds_airflow_job_status_command_pack.mjs +587 -0
- package/tools/bds_bas_log_read.mjs +23 -0
- package/tools/bds_bdm_httpd_log_read.mjs +24 -0
- package/tools/bds_chef_client_log_read.mjs +23 -0
- package/tools/bds_dashboard_links.mjs +178 -0
- package/tools/bds_dashboard_query_knowledge.mjs +258 -0
- package/tools/bds_dashboard_query_read.mjs +120 -0
- package/tools/bds_disk_io_alert_command_pack.mjs +287 -0
- package/tools/bds_environment_host_lookup.mjs +741 -0
- package/tools/bds_hdfs_datanode_log_read.mjs +23 -0
- package/tools/bds_hdfs_journalnode_log_read.mjs +23 -0
- package/tools/bds_hdfs_namenode_log_read.mjs +23 -0
- package/tools/bds_hdfs_path_knowledge.mjs +324 -0
- package/tools/bds_information_source_knowledge.mjs +356 -0
- package/tools/bds_kms_log_read.mjs +23 -0
- package/tools/bds_log_path_knowledge.mjs +267 -0
- package/tools/bds_machine_inventory.mjs +434 -0
- package/tools/bds_mapreduce_historyserver_log_read.mjs +23 -0
- package/tools/bds_migration_service_operation_command_pack.mjs +233 -0
- package/tools/bds_oncall_followup_payload_draft.mjs +285 -0
- package/tools/bds_pharos_query_pack.mjs +218 -0
- package/tools/bds_portal_operation_knowledge.mjs +212 -0
- package/tools/bds_prism_clone_status_links.mjs +129 -0
- package/tools/bds_prism_service_proxy_timeout_query_pack.mjs +224 -0
- package/tools/bds_public_cloud_pod_log_read.mjs +18 -0
- package/tools/bds_scylla_tenant_bucket_command_pack.mjs +323 -0
- package/tools/bds_service_proxy_log_read.mjs +23 -0
- package/tools/bds_spark_historyserver_log_read.mjs +32 -0
- package/tools/bds_spas_mt_log_read.mjs +23 -0
- package/tools/bds_tenant_data_operation_log_command_pack.mjs +321 -0
- package/tools/bds_yarn_app_health_command_pack.mjs +529 -0
- package/tools/bds_yarn_nodemanager_log_read.mjs +23 -0
- package/tools/bds_yarn_resourcemanager_log_read.mjs +23 -0
- package/tools/bds_zookeeper_log_read.mjs +23 -0
- package/tools/confluence_handoff_page_draft.mjs +173 -0
- package/vendor/dashboard/src/grafana-dashboard-query.mjs +61 -0
- package/vendor/extension-read-only-toolkit/LICENSE +202 -0
- package/vendor/extension-read-only-toolkit/README.md +29 -0
- package/vendor/extension-read-only-toolkit/package.json +46 -0
- package/vendor/extension-read-only-toolkit/src/devops-data-paths.mjs +222 -0
- package/vendor/extension-read-only-toolkit/src/devops-diagnostics.mjs +440 -0
- package/vendor/extension-read-only-toolkit/src/enterprise-api-read.mjs +180 -0
- package/vendor/extension-read-only-toolkit/src/read-only-command-pack.mjs +1 -0
- package/vendor/extension-read-only-toolkit/src/read-only-plan.mjs +45 -0
- package/vendor/extension-read-only-toolkit/src/read-only-shell-policy.d.mts +26 -0
- package/vendor/extension-read-only-toolkit/src/read-only-shell-policy.mjs +170 -0
- package/vendor/extension-workday-infra-access/LICENSE +202 -0
- package/vendor/extension-workday-infra-access/README.md +3 -0
- package/vendor/extension-workday-infra-access/agents/workday-infra-access-readonly.yaml +183 -0
- package/vendor/extension-workday-infra-access/package.json +49 -0
- package/vendor/extension-workday-infra-access/skills/workday-infra-access/SKILL.md +102 -0
- package/vendor/extension-workday-infra-access/skills/workday-infra-access/references/access-boundary-runbook.md +43 -0
- package/vendor/extension-workday-infra-access/skills/workday-infra-access/references/access-runbook.md +15 -0
- package/vendor/extension-workday-infra-access/skills/workday-infra-access/references/access-scylla-cloud-runbook.md +39 -0
- package/vendor/extension-workday-infra-access/skills/workday-infra-access/references/access-spc-argo-runbook.md +99 -0
- package/vendor/extension-workday-infra-access/src/workday-access-profiles.mjs +194 -0
- package/vendor/extension-workday-infra-access/tools/aws_cust_federated_readonly_command_pack.mjs +234 -0
- package/vendor/extension-workday-infra-access/tools/gcp_readonly_command_pack.mjs +167 -0
- package/vendor/extension-workday-infra-access/tools/public_cloud_access_status.mjs +48 -0
- package/vendor/extension-workday-infra-access/tools/workday_boundary_login.mjs +460 -0
- package/vendor/extension-workday-infra-access/tools/workday_private_cloud_sudo_readonly_command.mjs +386 -0
- package/vendor/extension-workday-infra-access/tools/workday_public_cloud_environment_map.mjs +189 -0
- package/vendor/extension-workday-infra-access/tools/workday_public_cloud_kubernetes_read.mjs +297 -0
- package/vendor/extension-workday-infra-access/tools/workday_public_cloud_spc_login.mjs +505 -0
- package/vendor/extension-workday-infra-access/tools/workday_spc_argo_readonly_command_pack.mjs +215 -0
- package/vendor/extension-workday-infra-access/workflows/public-cloud-readonly-investigation.js +99 -0
- package/workflows/bds-airflow-job-status-investigation.js +168 -0
- package/workflows/bds-disk-io-alert-investigation.js +173 -0
- package/workflows/bds-oncall-followup.js +112 -0
- package/workflows/bds-prism-service-proxy-timeout-investigation.js +69 -0
- package/workflows/bds-scylla-tenant-bucket-investigation.js +139 -0
- package/workflows/bds-tenant-data-operation-log-investigation.js +189 -0
- package/workflows/bds-yarn-app-health-investigation.js +217 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
export const description = "Summarize BDS Portal-derived operation entry points, environment scopes, and read/write boundaries for routing BDS investigations to the right runbook.";
|
|
2
|
+
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { defineReadOnlyTool, fail, ok } from "@nuvlore/extension-read-only-toolkit/devops-diagnostics";
|
|
5
|
+
|
|
6
|
+
const PORTAL_SOURCE = {
|
|
7
|
+
title: "BDS Portal",
|
|
8
|
+
pageId: "818177058",
|
|
9
|
+
url: "https://confluence.workday.com/display/BD/BDS+Portal",
|
|
10
|
+
observedVersion: 54
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export const BDS_PORTAL_OPERATION_CATALOG = [
|
|
14
|
+
{
|
|
15
|
+
domain: "portal",
|
|
16
|
+
title: "BDS Portal",
|
|
17
|
+
url: "https://confluence.workday.com/display/BD/BDS+Portal",
|
|
18
|
+
operationType: "navigation",
|
|
19
|
+
environmentScope: ["all"],
|
|
20
|
+
writeBoundary: "read-only",
|
|
21
|
+
notes: [
|
|
22
|
+
"Landing page for BDS team resources, support channels, dashboards, architecture, customer support, deployment, playbooks, monitoring, tenant management, onboarding, and build/release links.",
|
|
23
|
+
"Use it as the first Confluence discovery entry before drilling into narrower BDS pages."
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
domain: "cluster-inventory",
|
|
28
|
+
title: "BDS Cluster Information",
|
|
29
|
+
url: "https://confluence.workday.com/display/BD/BDS+Cluster+Information",
|
|
30
|
+
operationType: "environment-discovery",
|
|
31
|
+
environmentScope: ["CUST", "ENG"],
|
|
32
|
+
writeBoundary: "read-only",
|
|
33
|
+
notes: [
|
|
34
|
+
"Portal points here for current BDS cluster information.",
|
|
35
|
+
"Use this with bds_machine_inventory and dashboard/link tools when mapping cluster names to hosts or operational surfaces."
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
domain: "infrastructure-operations",
|
|
40
|
+
title: "BDS - Infrastructure Operations",
|
|
41
|
+
url: "https://confluence.workday.com/display/BD/BDS+-+Infrastructure+Operations",
|
|
42
|
+
operationType: "runbook-index",
|
|
43
|
+
environmentScope: ["CUST", "ENG", "NPRD", "PROD"],
|
|
44
|
+
writeBoundary: "mixed",
|
|
45
|
+
notes: [
|
|
46
|
+
"Infrastructure operations links to the new-cluster build procedure and current cluster facilities.",
|
|
47
|
+
"New-cluster build steps include INF/DC coordination, Chef role/org selection, rack info, LDAP, CNames, firewall validation, EDB/EMS data, BDS config repos, BDM init, patch, refresh_config, and Confluence page creation."
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
domain: "cluster-build",
|
|
52
|
+
title: "Creating New BDS Cluster",
|
|
53
|
+
url: "https://confluence.workday.com/display/BD/Creating+New+BDS+Cluster",
|
|
54
|
+
operationType: "buildout-runbook",
|
|
55
|
+
environmentScope: ["ENG", "NPRD", "PROD"],
|
|
56
|
+
writeBoundary: "write-heavy",
|
|
57
|
+
notes: [
|
|
58
|
+
"Chef organizations differ by environment: ENG uses dev-style BDS service orgs, while PROD uses prod-style BDS service orgs.",
|
|
59
|
+
"BDS config changes go to the appropriate bds-config repo and BDM/BDS mapping files before init.",
|
|
60
|
+
"Init, patch, and refresh_config are BDM-host curl operations and are not safe read-only probes.",
|
|
61
|
+
"Kubernetes cluster creation is called out as a separate playbook path and may not work during init state."
|
|
62
|
+
]
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
domain: "deployment",
|
|
66
|
+
title: "BDS End To End Deployment Process",
|
|
67
|
+
url: "https://confluence.workday.com/display/BD/BDS+End+To+End+Deployment+Process",
|
|
68
|
+
operationType: "deployment-runbook",
|
|
69
|
+
environmentScope: ["CUST", "ENG"],
|
|
70
|
+
writeBoundary: "write-heavy",
|
|
71
|
+
notes: [
|
|
72
|
+
"Deployment is staged as pre-deployment, INF preparation, BDS initialization, patching, tenant validation, and post-deployment.",
|
|
73
|
+
"CUST decommissioning requires a long maintenance-window lead time and explicit cleanup of Chef entries.",
|
|
74
|
+
"Validation topics include firewall checks, host hardware/OS/Chef checks, BDA/Prism standalone tenant tests, cloned tenant tests, mirroring, and DR."
|
|
75
|
+
]
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
domain: "scylla-oncall",
|
|
79
|
+
title: "BDS on Scylla On-call Playbook",
|
|
80
|
+
url: "https://confluence.workday.com/display/BD/BDS+on+Scylla+On-call+Playbook",
|
|
81
|
+
operationType: "oncall-runbook",
|
|
82
|
+
environmentScope: ["Scylla", "SPC", "FedRamp", "AWS", "GCP"],
|
|
83
|
+
writeBoundary: "mixed",
|
|
84
|
+
notes: [
|
|
85
|
+
"Production Scylla access is routed through SPC production access guidance.",
|
|
86
|
+
"Read-only triage areas include K8s pod list/describe/logs, tenant data replication/encryption checks, YARN/HDFS status, and common incident patterns.",
|
|
87
|
+
"Restarting containers/pods, scaling, upgrading, reset, DR failover, S3 object encryption updates, and mapping updates are write/remediation operations and must not be run from read-only investigation tools."
|
|
88
|
+
]
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
domain: "tenant-workflow",
|
|
92
|
+
title: "BDS Split Tenant Workflow in DC",
|
|
93
|
+
url: "https://confluence.workday.com/display/BD/BDS+Split+Tenant+Workflow+in+DC+v3",
|
|
94
|
+
operationType: "tenant-runbook",
|
|
95
|
+
environmentScope: ["DC", "ASH", "ATL", "PDX", "DUB"],
|
|
96
|
+
writeBoundary: "write-heavy",
|
|
97
|
+
notes: [
|
|
98
|
+
"BDS tenant copy should follow OMS tenant copy promptly and no later than the documented window.",
|
|
99
|
+
"Same-region split uses WMU clonePrismForTenantSplitAware from the target environment.",
|
|
100
|
+
"Cross-region split needs manual firewall coordination and Kraken key export/import plus BDS re-encryption.",
|
|
101
|
+
"WMU commands and EMS tag changes are write operations; read-only support should only inspect prerequisites and collect evidence."
|
|
102
|
+
]
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
domain: "tenant-workflow",
|
|
106
|
+
title: "BDS Transfer Tenant Workflow in DC",
|
|
107
|
+
url: "https://confluence.workday.com/display/BD/BDS+Transfer+Tenant+Workflow+in+DC",
|
|
108
|
+
operationType: "tenant-runbook",
|
|
109
|
+
environmentScope: ["DC"],
|
|
110
|
+
writeBoundary: "write-heavy",
|
|
111
|
+
notes: [
|
|
112
|
+
"Transfer tenant differs from split tenant: ownership changes without tenant clone.",
|
|
113
|
+
"The workflow includes Kraken customer/key setup, Prism group changes, BDS SPLIT tag use, encryption-zone update, re-encrypt, and final verifyPrism.",
|
|
114
|
+
"HDFS encryption-zone setfattr and WMU re-encryption are write operations; read-only investigation should stop at namespace lookup and current-zone evidence."
|
|
115
|
+
]
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
domain: "build-release",
|
|
119
|
+
title: "BDS PR Merge to Pass Integration Test Process",
|
|
120
|
+
url: "https://confluence.workday.com/display/BD/BDS+PR+Merge+to+Pass+Integration+Test+Process",
|
|
121
|
+
operationType: "ci-verification",
|
|
122
|
+
environmentScope: ["Bamboo", "TeamCity", "Jenkins", "BDS K8", "Scylla"],
|
|
123
|
+
writeBoundary: "read-only",
|
|
124
|
+
notes: [
|
|
125
|
+
"After PR merge, verify master/trunk build status and make sure integration-test builds passed with the PR commits or Jira issue association.",
|
|
126
|
+
"BDS K8 integration covers airflow and migration-services; Scylla routes include BDM, service-proxy, and SHS.",
|
|
127
|
+
"Cookbook and bds-service parcel release checks include Jenkins cookbook and parcel master builds."
|
|
128
|
+
]
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
domain: "onboarding",
|
|
132
|
+
title: "BDS - Onboarding",
|
|
133
|
+
url: "https://confluence.workday.com/display/BD/BDS+-+Onboarding",
|
|
134
|
+
operationType: "learning-index",
|
|
135
|
+
environmentScope: ["DC", "Scylla"],
|
|
136
|
+
writeBoundary: "read-only",
|
|
137
|
+
notes: [
|
|
138
|
+
"Onboarding links architecture, BDS DevOps overview, Workday environment/tenant management, DC clusters, Scylla clusters, production access, repos, Bamboo plans, Chef development, and cookbook change procedures.",
|
|
139
|
+
"Use this page to route unknown BDS questions to the correct narrower runbook."
|
|
140
|
+
]
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
domain: "monitoring",
|
|
144
|
+
title: "BDS Prod Cluster Critical Services Health Dashboard",
|
|
145
|
+
url: "https://confluence.workday.com/display/BD/BDS+Prod+Cluster+Critical+Services+Health+Dashboard",
|
|
146
|
+
operationType: "dashboard-index",
|
|
147
|
+
environmentScope: ["PROD"],
|
|
148
|
+
writeBoundary: "read-only",
|
|
149
|
+
notes: [
|
|
150
|
+
"Portal points to service health and cluster-level usage dashboards.",
|
|
151
|
+
"Use bds_dashboard_links, bds_dashboard_query_read, and pharos read tools for current evidence instead of relying on stale Confluence snapshots."
|
|
152
|
+
]
|
|
153
|
+
}
|
|
154
|
+
];
|
|
155
|
+
|
|
156
|
+
function normalize(value) {
|
|
157
|
+
return String(value || "").trim().toLowerCase();
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function matchesFilter(entry, input) {
|
|
161
|
+
const domain = normalize(input.domain);
|
|
162
|
+
if (domain && normalize(entry.domain) !== domain) return false;
|
|
163
|
+
const scope = normalize(input.environmentScope);
|
|
164
|
+
if (scope && !entry.environmentScope.some((item) => normalize(item) === scope)) return false;
|
|
165
|
+
const operationType = normalize(input.operationType);
|
|
166
|
+
if (operationType && normalize(entry.operationType) !== operationType) return false;
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export class BdsPortalOperationKnowledgeService {
|
|
171
|
+
async invoke(input = {}) {
|
|
172
|
+
const entries = BDS_PORTAL_OPERATION_CATALOG.filter((entry) => matchesFilter(entry, input));
|
|
173
|
+
return JSON.stringify({
|
|
174
|
+
mode: "bds-portal-operation-knowledge",
|
|
175
|
+
provider: "confluence-bds-portal-derived",
|
|
176
|
+
source: PORTAL_SOURCE,
|
|
177
|
+
filters: {
|
|
178
|
+
domain: input.domain ?? "",
|
|
179
|
+
environmentScope: input.environmentScope ?? "",
|
|
180
|
+
operationType: input.operationType ?? ""
|
|
181
|
+
},
|
|
182
|
+
count: entries.length,
|
|
183
|
+
entries
|
|
184
|
+
}, null, 2);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const defaultService = new BdsPortalOperationKnowledgeService();
|
|
189
|
+
|
|
190
|
+
export default defineReadOnlyTool({
|
|
191
|
+
name: "bds_portal_operation_knowledge",
|
|
192
|
+
description: "Summarize BDS Portal-derived operation entry points, environment scopes, and read/write boundaries for routing BDS investigations to the right runbook.",
|
|
193
|
+
inputSchema: {
|
|
194
|
+
domain: z.string().trim().min(1).max(80).optional(),
|
|
195
|
+
environmentScope: z.string().trim().min(1).max(80).optional(),
|
|
196
|
+
operationType: z.string().trim().min(1).max(80).optional()
|
|
197
|
+
},
|
|
198
|
+
async handler(input) {
|
|
199
|
+
try {
|
|
200
|
+
return ok(await defaultService.invoke(input));
|
|
201
|
+
} catch (error) {
|
|
202
|
+
return fail(error);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
export const __test = {
|
|
208
|
+
PORTAL_SOURCE,
|
|
209
|
+
BDS_PORTAL_OPERATION_CATALOG,
|
|
210
|
+
BdsPortalOperationKnowledgeService,
|
|
211
|
+
matchesFilter
|
|
212
|
+
};
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
export const description = "Generate read-only Confluence Prism Clone Status Dashboard links for BDS on-call clone monitoring.";
|
|
2
|
+
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { defineReadOnlyTool, fail, ok } from "@nuvlore/extension-read-only-toolkit/devops-diagnostics";
|
|
5
|
+
|
|
6
|
+
const DEFAULT_PAGE_ID = "1662698439";
|
|
7
|
+
const DEFAULT_ENVS = ["WD2-IMPL", "WD3-IMPL", "WD5-IMPL"];
|
|
8
|
+
const DEFAULT_CHECK_WINDOW = {
|
|
9
|
+
cadence: "weekly",
|
|
10
|
+
dayOfWeek: "Friday",
|
|
11
|
+
localTime: "19:30",
|
|
12
|
+
timezone: "America/Los_Angeles",
|
|
13
|
+
description: "Open around Friday 7:30 PM during BDS on-call to check clone status."
|
|
14
|
+
};
|
|
15
|
+
const STATUS_OPTIONS = ["", "RUNNING", "FAILED", "SUCCEEDED", "CANCELED"];
|
|
16
|
+
|
|
17
|
+
const inputSchema = {
|
|
18
|
+
envs: z.array(z.string().trim().min(1).max(64)).max(12).default(DEFAULT_ENVS),
|
|
19
|
+
status: z.enum(STATUS_OPTIONS).default(""),
|
|
20
|
+
tenantName: z.string().trim().max(128).default(""),
|
|
21
|
+
excludeTenant: z.string().trim().max(128).default(""),
|
|
22
|
+
pageId: z.string().trim().min(1).max(128).default(DEFAULT_PAGE_ID),
|
|
23
|
+
format: z.enum(["json", "markdown"]).default("json")
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
function normalizeEnv(value) {
|
|
27
|
+
return String(value ?? "").trim().toUpperCase();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function dashboardUrl({ envName, status, tenantName, excludeTenant, pageId }) {
|
|
31
|
+
const url = new URL("https://confluence.workday.com/display/PCDE/Prism+Clone+Status+Dashboard");
|
|
32
|
+
url.searchParams.set("pageId", pageId || DEFAULT_PAGE_ID);
|
|
33
|
+
url.searchParams.set("run_1_ENVNAME", normalizeEnv(envName));
|
|
34
|
+
url.searchParams.set("run_1_STATUS", status || "");
|
|
35
|
+
url.searchParams.set("run_1_TENANT_NAME", tenantName || "");
|
|
36
|
+
url.searchParams.set("run_1_EXCLUDE_TENANT", excludeTenant || "");
|
|
37
|
+
url.searchParams.set("run_1", "run");
|
|
38
|
+
return url.toString();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function buildDashboards(input = {}) {
|
|
42
|
+
const envs = (input.envs?.length ? input.envs : DEFAULT_ENVS)
|
|
43
|
+
.map(normalizeEnv)
|
|
44
|
+
.filter(Boolean);
|
|
45
|
+
const uniqueEnvs = [...new Set(envs)];
|
|
46
|
+
return uniqueEnvs.map((envName) => ({
|
|
47
|
+
envName,
|
|
48
|
+
url: dashboardUrl({
|
|
49
|
+
envName,
|
|
50
|
+
status: input.status || "",
|
|
51
|
+
tenantName: input.tenantName || "",
|
|
52
|
+
excludeTenant: input.excludeTenant || "",
|
|
53
|
+
pageId: input.pageId || DEFAULT_PAGE_ID
|
|
54
|
+
})
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function bdsPrismCloneStatusLinks(input = {}) {
|
|
59
|
+
const dashboards = buildDashboards(input);
|
|
60
|
+
const result = {
|
|
61
|
+
mode: "read-only-links",
|
|
62
|
+
remoteRead: "not_executed",
|
|
63
|
+
pageTitle: "Prism Clone Status Dashboard",
|
|
64
|
+
pageId: input.pageId || DEFAULT_PAGE_ID,
|
|
65
|
+
filters: {
|
|
66
|
+
status: input.status || "",
|
|
67
|
+
tenantName: input.tenantName || "",
|
|
68
|
+
excludeTenant: input.excludeTenant || ""
|
|
69
|
+
},
|
|
70
|
+
suggestedCheckWindow: DEFAULT_CHECK_WINDOW,
|
|
71
|
+
dashboards,
|
|
72
|
+
oncallNotes: [
|
|
73
|
+
"Open each environment dashboard around Friday 7:30 PM America/Los_Angeles during BDS on-call clone monitoring.",
|
|
74
|
+
"Use tenantName when checking a single tenant; otherwise keep it empty to scan all active clone rows.",
|
|
75
|
+
"If a clone looks stuck or failed, collect the dashboard row fields before starting deeper Bamboo, Airflow, or BDS log investigation.",
|
|
76
|
+
"This tool only generates Confluence dashboard links; it does not read or mutate Confluence state."
|
|
77
|
+
]
|
|
78
|
+
};
|
|
79
|
+
return input.format === "markdown" ? renderMarkdown(result) : JSON.stringify(result, null, 2);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function renderMarkdown(result) {
|
|
83
|
+
return [
|
|
84
|
+
"# Prism Clone Status Dashboard Links",
|
|
85
|
+
"",
|
|
86
|
+
`Mode: ${result.mode}`,
|
|
87
|
+
`Remote read: ${result.remoteRead}`,
|
|
88
|
+
`Page ID: ${result.pageId}`,
|
|
89
|
+
`Suggested check: ${result.suggestedCheckWindow.dayOfWeek} ${result.suggestedCheckWindow.localTime} ${result.suggestedCheckWindow.timezone}`,
|
|
90
|
+
"",
|
|
91
|
+
"## Dashboards",
|
|
92
|
+
...result.dashboards.map((dashboard) => `- ${dashboard.envName}: ${dashboard.url}`),
|
|
93
|
+
"",
|
|
94
|
+
"## On-call Notes",
|
|
95
|
+
...result.oncallNotes.map((item) => `- ${item}`)
|
|
96
|
+
].join("\n");
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export class BdsPrismCloneStatusLinksService {
|
|
100
|
+
invoke(input) {
|
|
101
|
+
return bdsPrismCloneStatusLinks(input);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const defaultService = new BdsPrismCloneStatusLinksService();
|
|
106
|
+
|
|
107
|
+
export default defineReadOnlyTool({
|
|
108
|
+
name: "bds_prism_clone_status_links",
|
|
109
|
+
description: "Generate read-only Confluence Prism Clone Status Dashboard links for BDS on-call clone monitoring.",
|
|
110
|
+
inputSchema,
|
|
111
|
+
annotations: { openWorldHint: false },
|
|
112
|
+
async handler(input) {
|
|
113
|
+
try {
|
|
114
|
+
return ok(defaultService.invoke(input));
|
|
115
|
+
} catch (error) {
|
|
116
|
+
return fail(error);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
export const __test = {
|
|
122
|
+
DEFAULT_CHECK_WINDOW,
|
|
123
|
+
DEFAULT_ENVS,
|
|
124
|
+
DEFAULT_PAGE_ID,
|
|
125
|
+
BdsPrismCloneStatusLinksService,
|
|
126
|
+
bdsPrismCloneStatusLinks,
|
|
127
|
+
buildDashboards,
|
|
128
|
+
dashboardUrl
|
|
129
|
+
};
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
export const description = "Generate a atomic-helper, read-only Jira/Kubernetes query pack for Prism Spark on K8s BdsCipherClient timeouts against BDS bds-service-proxy; does not call Jira, Kubernetes, or SPC.";
|
|
2
|
+
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { defineReadOnlyTool, fail, ok } from "@nuvlore/extension-read-only-toolkit/devops-diagnostics";
|
|
5
|
+
import { ReadOnlyStep } from "@nuvlore/extension-read-only-toolkit/read-only-command-pack";
|
|
6
|
+
|
|
7
|
+
const DEFAULT_CLUSTER = "s0109";
|
|
8
|
+
const DEFAULT_NAMESPACE = "bds";
|
|
9
|
+
const DEFAULT_BDS_SERVICE_PROXY = "bds-service-proxy";
|
|
10
|
+
const DEFAULT_JIRA_BASE_URL = "https://jira2.workday.com";
|
|
11
|
+
const LEGACY_KEYCHAIN_ALIAS = ["wal", "lee"].join("");
|
|
12
|
+
|
|
13
|
+
const clusterSchema = z.string().min(1).max(64).regex(/^[A-Za-z0-9_.:-]+$/);
|
|
14
|
+
const namespaceSchema = z.string().min(1).max(63).regex(/^[a-z0-9]([-a-z0-9]*[a-z0-9])?$/);
|
|
15
|
+
const jiraKeySchema = z.string().min(1).max(32).regex(/^[A-Z][A-Z0-9]+-[0-9]+$/).optional();
|
|
16
|
+
const cidSchema = z.string().min(1).max(128).regex(/^[A-Za-z0-9_|:-]+$/).optional();
|
|
17
|
+
const tenantSchema = z.string().min(1).max(128).regex(/^[A-Za-z0-9_.-]+$/).optional();
|
|
18
|
+
const appIdSchema = z.string().min(1).max(160).regex(/^[A-Za-z0-9_.:-]+$/).optional();
|
|
19
|
+
const timestampSchema = z.string().min(1).max(64).optional();
|
|
20
|
+
|
|
21
|
+
const SAFETY_RULES = [
|
|
22
|
+
"read-only only: Jira GET, spc connect, kubectl get/describe/logs/exec for ls/grep/head/tail only, and auth can-i checks",
|
|
23
|
+
"never print Jira, Keychain, AWS, LDAP, or Kubernetes credentials",
|
|
24
|
+
"use AWS_PROFILE=sso-cust for cust SPC sessions; refresh with sso-cli aws --force --profile sso-cust --region us-east-1 when ExpiredToken appears",
|
|
25
|
+
"verify kubectl context, auth whoami, and auth can-i before drawing conclusions from missing pods or logs",
|
|
26
|
+
"treat kubectl logs retention as incomplete when the returned timestamps start after the incident window",
|
|
27
|
+
"prefer bds-service-proxy local log files under /opt/bds-service-proxy/log when kubectl logs misses historical incident windows",
|
|
28
|
+
"separate Prism Spark driver client-side timeout evidence from bds-service-proxy service-side error evidence",
|
|
29
|
+
"check Prism/OMS namespace RBAC before claiming those pod logs or dump files are unavailable"
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
class BdsPrismServiceProxyTimeoutQueryPack {
|
|
33
|
+
constructor(input) {
|
|
34
|
+
this.cluster = input.cluster ?? DEFAULT_CLUSTER;
|
|
35
|
+
this.namespace = input.namespace ?? DEFAULT_NAMESPACE;
|
|
36
|
+
this.serviceProxy = input.serviceProxy ?? DEFAULT_BDS_SERVICE_PROXY;
|
|
37
|
+
this.jiraKey = input.jiraKey;
|
|
38
|
+
this.cid = input.cid;
|
|
39
|
+
this.tenant = input.tenant;
|
|
40
|
+
this.appId = input.appId;
|
|
41
|
+
this.incidentUtc = input.incidentUtc;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
grepPattern() {
|
|
45
|
+
return [
|
|
46
|
+
this.tenant,
|
|
47
|
+
this.cid,
|
|
48
|
+
this.appId,
|
|
49
|
+
"BdsCipherClient",
|
|
50
|
+
"generateKey",
|
|
51
|
+
"generatedek",
|
|
52
|
+
"KMSClientException",
|
|
53
|
+
"SocketTimeout",
|
|
54
|
+
"Read timed out",
|
|
55
|
+
"503",
|
|
56
|
+
"ERROR",
|
|
57
|
+
"WARN"
|
|
58
|
+
].filter(Boolean).join("|");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
incidentWindowPattern() {
|
|
62
|
+
if (!this.incidentUtc) return "<YYYY-MM-DDTHH:MM>";
|
|
63
|
+
const match = this.incidentUtc.match(/^(\d{4}-\d{2}-\d{2})[T\s](\d{2}):(\d{2})/);
|
|
64
|
+
if (!match) return "<YYYY-MM-DDTHH:MM>";
|
|
65
|
+
return `${match[1]}T${match[2]}:${match[3]}`;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
commands() {
|
|
69
|
+
const kube = "AWS_PROFILE=sso-cust kubectl --kubeconfig=$HOME/.kube/spc-config";
|
|
70
|
+
const serviceSelector = `app=${this.serviceProxy}`;
|
|
71
|
+
const incidentMinute = this.incidentWindowPattern();
|
|
72
|
+
const grepPattern = this.grepPattern();
|
|
73
|
+
return [
|
|
74
|
+
new ReadOnlyStep({
|
|
75
|
+
id: "00-jira-evidence",
|
|
76
|
+
purpose: "Read the Prism ticket and Chiron attachments without exposing Jira credentials.",
|
|
77
|
+
command: [
|
|
78
|
+
this.jiraKey
|
|
79
|
+
? `jira_api_read /rest/api/2/issue/${this.jiraKey}?fields=summary,status,comment,attachment,labels,description`
|
|
80
|
+
: "jira_api_read /rest/api/2/issue/<PRISM-issue>?fields=summary,status,comment,attachment,labels,description",
|
|
81
|
+
`If the default devops-tool Jira Keychain account is absent, check the legacy alias service=${LEGACY_KEYCHAIN_ALIAS} account=${LEGACY_KEYCHAIN_ALIAS}.jira and use it only as a secret source; never print the token.`,
|
|
82
|
+
"For Chiron attachments, fetch only bounded snippets around BdsCipherClient, generateKey, KMSClientException, SocketTimeoutException, DeltaCommitCommandOptions, manifest, appId, cid, and OMS dump paths."
|
|
83
|
+
].join("\n"),
|
|
84
|
+
expectedEvidence: "PRISM issue labels, Spark appId, tenant, cluster, Chiron log/json attachment ids, Delta commit path, manifest, and OMS dump file references"
|
|
85
|
+
}),
|
|
86
|
+
new ReadOnlyStep({
|
|
87
|
+
id: "01-spc-connect",
|
|
88
|
+
purpose: "Open the customer cluster tunnel with the right AWS profile and verify the Kubernetes identity.",
|
|
89
|
+
command: [
|
|
90
|
+
"sso-cli aws --force --profile sso-cust --region us-east-1 # only when AWS STS is expired",
|
|
91
|
+
`AWS_PROFILE=sso-cust spc connect cust ${this.cluster}`,
|
|
92
|
+
`${kube} config current-context`,
|
|
93
|
+
`${kube} auth whoami`,
|
|
94
|
+
`${kube} auth can-i get pods -n ${this.namespace}`,
|
|
95
|
+
`${kube} auth can-i get pods/log -n ${this.namespace}`,
|
|
96
|
+
`${kube} auth can-i create pods/exec -n ${this.namespace}`
|
|
97
|
+
].join("\n"),
|
|
98
|
+
expectedEvidence: "context points to the requested cluster, authenticated user/groups, and namespace-level permissions"
|
|
99
|
+
}),
|
|
100
|
+
new ReadOnlyStep({
|
|
101
|
+
id: "02-service-proxy-state",
|
|
102
|
+
purpose: "Confirm current bds-service-proxy pod readiness, image, endpoints, starts, and restarts.",
|
|
103
|
+
command: [
|
|
104
|
+
`${kube} get deploy,pods,svc,endpoints -n ${this.namespace} -l ${serviceSelector} -o wide`,
|
|
105
|
+
`${kube} describe pod -n ${this.namespace} <old-service-proxy-pod> | sed -n '1,220p'`,
|
|
106
|
+
`${kube} get pod -n ${this.namespace} <old-service-proxy-pod> -o jsonpath='{.status.containerStatuses[?(@.name=="${this.serviceProxy}")].restartCount}{"\\n"}{.status.containerStatuses[?(@.name=="${this.serviceProxy}")].state.running.startedAt}{"\\n"}{.status.containerStatuses[?(@.name=="${this.serviceProxy}")].lastState}{"\\n"}'`
|
|
107
|
+
].join("\n"),
|
|
108
|
+
expectedEvidence: "pod covering the incident window, restart count, image tag, service ClusterIP, endpoints, and node placement"
|
|
109
|
+
}),
|
|
110
|
+
new ReadOnlyStep({
|
|
111
|
+
id: "03-kubectl-log-retention-check",
|
|
112
|
+
purpose: "Check whether kubectl logs actually contains the incident window before using it as negative evidence.",
|
|
113
|
+
command: [
|
|
114
|
+
`${kube} logs -n ${this.namespace} <old-service-proxy-pod> -c ${this.serviceProxy} --since-time=<incident-start-utc> --timestamps --limit-bytes=20000 | sed -n '1,25p'`,
|
|
115
|
+
"If the first returned timestamp is after the incident window, do not claim the incident window had no service-proxy errors from kubectl logs alone."
|
|
116
|
+
].join("\n"),
|
|
117
|
+
expectedEvidence: "earliest returned log timestamp and whether Kubernetes log retention covers the incident minute"
|
|
118
|
+
}),
|
|
119
|
+
new ReadOnlyStep({
|
|
120
|
+
id: "04-local-service-proxy-log-window",
|
|
121
|
+
purpose: "Use pod-local rotated logs for historical service-side evidence when kubectl logs is truncated or rotated.",
|
|
122
|
+
command: [
|
|
123
|
+
`${kube} exec -n ${this.namespace} <old-service-proxy-pod> -c ${this.serviceProxy} -- sh -lc 'ls -lah /opt/bds-service-proxy/log /var/log/bds-service-proxy 2>/dev/null || true'`,
|
|
124
|
+
`${kube} exec -n ${this.namespace} <old-service-proxy-pod> -c ${this.serviceProxy} -- sh -lc "grep -n '${incidentMinute}' /opt/bds-service-proxy/log/bds-service-proxy.log | grep -Ei '${grepPattern}' | head -200"`,
|
|
125
|
+
`${kube} exec -n ${this.namespace} <old-service-proxy-pod> -c ${this.serviceProxy} -- sh -lc "grep -n '${this.tenant ?? "<tenant>"}' /opt/bds-service-proxy/log/bds-service-proxy-audit.log | grep '${incidentMinute}' | head -160"`
|
|
126
|
+
].join("\n"),
|
|
127
|
+
expectedEvidence: "timestamped service-proxy request/audit lines for the tenant and incident minute, including service-side duration and any ERROR/WARN/503/timeout signals"
|
|
128
|
+
}),
|
|
129
|
+
new ReadOnlyStep({
|
|
130
|
+
id: "05-prism-and-oms-rbac-boundary",
|
|
131
|
+
purpose: "Verify whether Prism Spark pod logs or OMS dump files can be inspected directly, instead of assuming they are absent.",
|
|
132
|
+
command: [
|
|
133
|
+
"for ns in prism oms bds; do for r in pods pods/log pods/exec; do kubectl --kubeconfig=$HOME/.kube/spc-config auth can-i get \"$r\" -n \"$ns\" 2>/dev/null || kubectl --kubeconfig=$HOME/.kube/spc-config auth can-i create \"$r\" -n \"$ns\" 2>/dev/null; done; done",
|
|
134
|
+
`${kube} get pod -n prism <prism-pod-from-jira-label> -o wide`,
|
|
135
|
+
`${kube} exec -n prism <prism-or-oms-pod> -- sh -lc "ls -lah /usr/local/workday-oms/logs/dumps && grep -n '${this.cid ?? "<cid>"}' /usr/local/workday-oms/logs/dumps/<dump-file> | head -80"`
|
|
136
|
+
].join("\n"),
|
|
137
|
+
expectedEvidence: "RBAC yes/no for Prism/OMS namespaces, Spark pod availability if permitted, and whether OMS dump paths are directly readable"
|
|
138
|
+
})
|
|
139
|
+
];
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
toMarkdown() {
|
|
143
|
+
return [
|
|
144
|
+
"# BDS Prism Service-Proxy Timeout Read-Only Query Pack",
|
|
145
|
+
"",
|
|
146
|
+
`Cluster: ${this.cluster}`,
|
|
147
|
+
`Namespace: ${this.namespace}`,
|
|
148
|
+
`Service proxy: ${this.serviceProxy}`,
|
|
149
|
+
this.jiraKey ? `Jira: ${this.jiraKey}` : "",
|
|
150
|
+
this.tenant ? `Tenant: ${this.tenant}` : "",
|
|
151
|
+
this.cid ? `CID: ${this.cid}` : "",
|
|
152
|
+
this.appId ? `Spark appId: ${this.appId}` : "",
|
|
153
|
+
this.incidentUtc ? `Incident UTC: ${this.incidentUtc}` : "",
|
|
154
|
+
"",
|
|
155
|
+
"## System Boundary",
|
|
156
|
+
"",
|
|
157
|
+
"Prism Spark on K8s calls `BdsCipherClient` in the Spark driver. The driver calls BDS `bds-service-proxy`; `bds-service-proxy` then performs the tenant key/decrypt flow such as SIR key fetches. A Prism driver `SocketTimeoutException` proves the client waited too long for a response, but does not by itself prove a service-proxy outage.",
|
|
158
|
+
"",
|
|
159
|
+
"## Safety Boundary",
|
|
160
|
+
"",
|
|
161
|
+
...SAFETY_RULES.map((rule) => `- ${rule}`),
|
|
162
|
+
"",
|
|
163
|
+
"## Read-Only Commands",
|
|
164
|
+
"",
|
|
165
|
+
...this.commands().map((command) => command.toMarkdown()),
|
|
166
|
+
"",
|
|
167
|
+
"Procedure, interpretation, and reply shape live in the `bds-prism-service-proxy-timeout-investigation` skill and runbook."
|
|
168
|
+
].filter(Boolean).join("\n");
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
toJson() {
|
|
172
|
+
return {
|
|
173
|
+
cluster: this.cluster,
|
|
174
|
+
namespace: this.namespace,
|
|
175
|
+
serviceProxy: this.serviceProxy,
|
|
176
|
+
jiraKey: this.jiraKey,
|
|
177
|
+
tenant: this.tenant,
|
|
178
|
+
cid: this.cid,
|
|
179
|
+
appId: this.appId,
|
|
180
|
+
incidentUtc: this.incidentUtc,
|
|
181
|
+
systemBoundary: "Prism Spark on K8s driver -> BdsCipherClient -> bds-service-proxy -> tenant key/decrypt backend",
|
|
182
|
+
safetyBoundary: SAFETY_RULES,
|
|
183
|
+
keychainFallbacks: ["devops-tool/devops-tool.jira", `${LEGACY_KEYCHAIN_ALIAS}/${LEGACY_KEYCHAIN_ALIAS}.jira`],
|
|
184
|
+
spcAccess: ["sso-cli aws --force --profile sso-cust --region us-east-1", `AWS_PROFILE=sso-cust spc connect cust ${this.cluster}`],
|
|
185
|
+
historicalLogPaths: ["/opt/bds-service-proxy/log/bds-service-proxy.log", "/opt/bds-service-proxy/log/bds-service-proxy-audit.log"],
|
|
186
|
+
commands: this.commands().map((command) => command.toJson())
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function buildResponse(input) {
|
|
192
|
+
const commandPack = new BdsPrismServiceProxyTimeoutQueryPack(input);
|
|
193
|
+
return input.format === "json" ? JSON.stringify(commandPack.toJson(), null, 2) : commandPack.toMarkdown();
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export default defineReadOnlyTool({
|
|
197
|
+
name: "bds_prism_service_proxy_timeout_query_pack",
|
|
198
|
+
description: "Generate a atomic-helper, read-only Jira/Kubernetes query pack for Prism Spark on K8s BdsCipherClient timeouts against BDS bds-service-proxy; does not call Jira, Kubernetes, or SPC.",
|
|
199
|
+
inputSchema: {
|
|
200
|
+
cluster: clusterSchema.default(DEFAULT_CLUSTER),
|
|
201
|
+
namespace: namespaceSchema.default(DEFAULT_NAMESPACE),
|
|
202
|
+
serviceProxy: namespaceSchema.default(DEFAULT_BDS_SERVICE_PROXY),
|
|
203
|
+
jiraKey: jiraKeySchema.describe("Optional Prism Jira key, for example PRISM-229374."),
|
|
204
|
+
cid: cidSchema.describe("Optional common id such as DSP|4016D3FA|19E985A1."),
|
|
205
|
+
tenant: tenantSchema.describe("Optional tenant name."),
|
|
206
|
+
appId: appIdSchema.describe("Optional Spark app id."),
|
|
207
|
+
incidentUtc: timestampSchema.describe("Optional incident time in UTC, for example 2026-06-05T15:38:02Z."),
|
|
208
|
+
format: z.enum(["markdown", "json"]).default("markdown")
|
|
209
|
+
},
|
|
210
|
+
annotations: { openWorldHint: true },
|
|
211
|
+
async handler(input) {
|
|
212
|
+
try {
|
|
213
|
+
return ok(buildResponse(input));
|
|
214
|
+
} catch (error) {
|
|
215
|
+
return fail(error);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
export const __test = {
|
|
221
|
+
BdsPrismServiceProxyTimeoutQueryPack,
|
|
222
|
+
SAFETY_RULES,
|
|
223
|
+
buildResponse
|
|
224
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const description = "Read public-cloud Kubernetes pod, deployment, statefulset, or sidecar logs with kubectl after SPC login; does not use k9s.";
|
|
2
|
+
|
|
3
|
+
import { createPublicCloudPodLogReadTool } from "../src/bds-atomic-log-tools.mjs";
|
|
4
|
+
|
|
5
|
+
const sharedTool = createPublicCloudPodLogReadTool({
|
|
6
|
+
toolName: "bds_public_cloud_pod_log_read",
|
|
7
|
+
description: "Read public-cloud Kubernetes pod, deployment, statefulset, or sidecar logs with kubectl after SPC login; does not use k9s."
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
export default {
|
|
11
|
+
name: sharedTool.name,
|
|
12
|
+
description,
|
|
13
|
+
inputSchema: sharedTool.inputSchema,
|
|
14
|
+
meta: sharedTool.meta,
|
|
15
|
+
annotations: sharedTool.annotations,
|
|
16
|
+
invoke: sharedTool.invoke,
|
|
17
|
+
handler: sharedTool.handler
|
|
18
|
+
};
|