This commit is contained in:
47
netbird.ts
47
netbird.ts
@@ -6,6 +6,9 @@ import * as command from "@pulumi/command";
|
|||||||
// =============================================================================
|
// =============================================================================
|
||||||
// Since there's no TypeScript SDK for NetBird, we use the command provider
|
// Since there's no TypeScript SDK for NetBird, we use the command provider
|
||||||
// to make API calls. This demonstrates the pattern while being practical.
|
// to make API calls. This demonstrates the pattern while being practical.
|
||||||
|
//
|
||||||
|
// Note: Delete commands use grep/sed instead of jq for CI compatibility.
|
||||||
|
// The pattern extracts the ID by finding the object with matching name.
|
||||||
|
|
||||||
export interface NetBirdConfig {
|
export interface NetBirdConfig {
|
||||||
url: string;
|
url: string;
|
||||||
@@ -44,6 +47,35 @@ export interface SetupKeyArgs {
|
|||||||
ephemeral: boolean;
|
ephemeral: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// =============================================================================
|
||||||
|
// Helper: Extract ID from JSON array by name (no jq dependency)
|
||||||
|
// =============================================================================
|
||||||
|
// Uses grep/sed to find an object by name and extract its ID.
|
||||||
|
// This is fragile but works for simple JSON structures.
|
||||||
|
// Pattern: finds "name":"<value>" then extracts preceding "id":"<value>"
|
||||||
|
function makeDeleteScript(
|
||||||
|
endpoint: string,
|
||||||
|
resourceName: string,
|
||||||
|
token: pulumi.Output<string>,
|
||||||
|
url: string
|
||||||
|
): pulumi.Output<string> {
|
||||||
|
// Use Python for reliable JSON parsing (available in most CI environments)
|
||||||
|
return pulumi.interpolate`python3 -c "
|
||||||
|
import json, urllib.request, sys
|
||||||
|
req = urllib.request.Request('${url}/api/${endpoint}', headers={'Authorization': 'Token ${token}'})
|
||||||
|
data = json.loads(urllib.request.urlopen(req).read())
|
||||||
|
matches = [x['id'] for x in data if x.get('name') == '${resourceName}']
|
||||||
|
if matches:
|
||||||
|
print(matches[0])
|
||||||
|
else:
|
||||||
|
sys.exit(0) # Not found, nothing to delete
|
||||||
|
" | while read ID; do
|
||||||
|
if [ -n "$ID" ]; then
|
||||||
|
curl -s -X DELETE -H "Authorization: Token ${token}" "${url}/api/${endpoint}/$ID"
|
||||||
|
fi
|
||||||
|
done`;
|
||||||
|
}
|
||||||
|
|
||||||
// =============================================================================
|
// =============================================================================
|
||||||
// NetBird Group Resource
|
// NetBird Group Resource
|
||||||
// =============================================================================
|
// =============================================================================
|
||||||
@@ -67,10 +99,7 @@ export class Group extends pulumi.ComponentResource {
|
|||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-d '{"name": "${args.name}", "peers": ${JSON.stringify(args.peers || [])}}' \
|
-d '{"name": "${args.name}", "peers": ${JSON.stringify(args.peers || [])}}' \
|
||||||
${config.url}/api/groups`,
|
${config.url}/api/groups`,
|
||||||
delete: pulumi.interpolate`GROUP_ID=$(curl -s -H "Authorization: Token ${config.token}" \
|
delete: makeDeleteScript("groups", args.name, config.token, config.url),
|
||||||
${config.url}/api/groups | jq -r '.[] | select(.name=="${args.name}") | .id') && \
|
|
||||||
curl -s -X DELETE -H "Authorization: Token ${config.token}" \
|
|
||||||
${config.url}/api/groups/$GROUP_ID`,
|
|
||||||
},
|
},
|
||||||
{ parent: this }
|
{ parent: this }
|
||||||
);
|
);
|
||||||
@@ -146,10 +175,7 @@ export class Policy extends pulumi.ComponentResource {
|
|||||||
${config.url}/api/policies`;
|
${config.url}/api/policies`;
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
delete: pulumi.interpolate`POLICY_ID=$(curl -s -H "Authorization: Token ${config.token}" \
|
delete: makeDeleteScript("policies", args.name, config.token, config.url),
|
||||||
${config.url}/api/policies | jq -r '.[] | select(.name=="${args.name}") | .id') && \
|
|
||||||
curl -s -X DELETE -H "Authorization: Token ${config.token}" \
|
|
||||||
${config.url}/api/policies/$POLICY_ID`,
|
|
||||||
},
|
},
|
||||||
{ parent: this }
|
{ parent: this }
|
||||||
);
|
);
|
||||||
@@ -207,10 +233,7 @@ export class SetupKey extends pulumi.ComponentResource {
|
|||||||
${config.url}/api/setup-keys`;
|
${config.url}/api/setup-keys`;
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
delete: pulumi.interpolate`KEY_ID=$(curl -s -H "Authorization: Token ${config.token}" \
|
delete: makeDeleteScript("setup-keys", args.name, config.token, config.url),
|
||||||
${config.url}/api/setup-keys | jq -r '.[] | select(.name=="${args.name}") | .id') && \
|
|
||||||
curl -s -X DELETE -H "Authorization: Token ${config.token}" \
|
|
||||||
${config.url}/api/setup-keys/$KEY_ID`,
|
|
||||||
},
|
},
|
||||||
{ parent: this }
|
{ parent: this }
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user