Skip to content
Merged
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
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* linguist-language=C#
62 changes: 62 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
name: Tests

on:
push:
pull_request:
types: [opened, synchronize, reopened]

jobs:
unit-tests:
name: Unit Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.0.x'

- name: Authenticate to Keyfactor NuGet feed
run: dotnet nuget add source https://nuget.pkg.github.com/Keyfactor/index.json -n keyfactor -u ${{ github.actor }} -p ${{ secrets.GITHUB_TOKEN }} --store-password-in-clear-text

- name: Restore
run: dotnet restore tests/AkeylessPam.Unit.Tests/AkeylessPam.Unit.Tests.csproj

- name: Run unit tests
run: dotnet test tests/AkeylessPam.Unit.Tests/ --no-restore --collect:"XPlat Code Coverage" --results-directory ./coverage

- name: Upload coverage
uses: actions/upload-artifact@v4
with:
name: coverage-unit
path: coverage/**/coverage.cobertura.xml

integration-tests:
name: Integration Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.0.x'

- name: Authenticate to Keyfactor NuGet feed
run: dotnet nuget add source https://nuget.pkg.github.com/Keyfactor/index.json -n keyfactor -u ${{ github.actor }} -p ${{ secrets.GITHUB_TOKEN }} --store-password-in-clear-text

- name: Restore
run: dotnet restore tests/AkeylessPam.Integration.Tests/AkeylessPam.Integration.Tests.csproj

- name: Run integration tests
env:
AKEYLESS_ACCESS_ID: ${{ secrets.AKEYLESS_ACCESS_ID }}
AKEYLESS_ACCESS_KEY: ${{ secrets.AKEYLESS_ACCESS_KEY }}
AKEYLESS_API_URL: ${{ vars.AKEYLESS_API_URL }}
AKEYLESS_SECRET_STATIC_TEXT: ${{ vars.AKEYLESS_SECRET_STATIC_TEXT }}
AKEYLESS_SECRET_STATIC_TEXT_2: ${{ vars.AKEYLESS_SECRET_STATIC_TEXT_2 }}
AKEYLESS_SECRET_STATIC_KV: ${{ vars.AKEYLESS_SECRET_STATIC_KV }}
AKEYLESS_SECRET_STATIC_JSON: ${{ vars.AKEYLESS_SECRET_STATIC_JSON }}
AKEYLESS_SECRET_STATIC_JSON_RAW: ${{ vars.AKEYLESS_SECRET_STATIC_JSON_RAW }}
run: dotnet test tests/AkeylessPam.Integration.Tests/ --no-restore
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -351,4 +351,9 @@ MigrationBackup/

*.env

.idea/*
.idea/*

manifest.json

.claude/*
CLAUDE.md
12 changes: 11 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
# v1.0.0

- Initial release of Akeyless PAM Provider
Initial release of the Akeyless PAM Provider for Keyfactor Command and Universal Orchestrator.

### Features

- Retrieve secrets from Akeyless and surface them as credentials to Keyfactor Command certificate stores and orchestrator jobs
- **Access Key (API Key) authentication** — authenticates to the Akeyless API using an Access ID and Access Key pair
- **Static Text secrets** (`static_text`) — returns the secret value as a plain string
- **Static JSON secrets** (`static_json`) — returns the full JSON blob, or extracts a single field by name via `StaticSecretFieldName`
- **Static Key-Value secrets** (`static_kv`) — extracts a single field from a key-value secret by name via `StaticSecretFieldName`
- Configurable Akeyless API URL (defaults to `https://api.akeyless.io`); can be overridden at runtime via the `AKEYLESS_API_URL` environment variable
- Targets .NET 8.0 and .NET 10.0
51 changes: 51 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
SLN := akeyless-pam.sln
LIB := akeyless-pam/akeyless-pam.csproj
UNIT := tests/AkeylessPam.Unit.Tests/AkeylessPam.Unit.Tests.csproj
INT := tests/AkeylessPam.Integration.Tests/AkeylessPam.Integration.Tests.csproj
CONSOLE := TestConsole/TestConsole.csproj
MANIFEST := akeyless-pam/manifest.json
LIB_BIN := akeyless-pam/bin

.PHONY: all build build-release clean test test-unit test-integration console restore

all: build

## Build (debug)
build:
dotnet build $(LIB)
@for d in $(LIB_BIN)/Debug/net*/; do cp $(MANIFEST) $$d; done

## Build (release)
build-release:
dotnet build $(LIB) -c Release
@for d in $(LIB_BIN)/Release/net*/; do cp $(MANIFEST) $$d; done

## Restore NuGet packages
restore:
dotnet restore $(SLN)

## Clean all projects
clean:
dotnet clean $(SLN)

## Run all tests
test:
dotnet test $(SLN)

## Run unit tests only
test-unit:
dotnet test $(UNIT)

## Run integration tests only
test-integration:
dotnet test $(INT)

## Run the test console
console:
dotnet run --project $(CONSOLE)

Comment on lines +3 to +46
Copy link

Copilot AI Apr 22, 2026

Choose a reason for hiding this comment

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

Makefile's console target references TestConsole/TestConsole.csproj, but that project file is removed in this PR. Either remove the console target/variable or update it to the new location so make console doesn't fail.

Copilot uses AI. Check for mistakes.
## Show available targets
help:
@grep -E '^## ' Makefile | sed 's/## / /'
@echo ""
@echo "Targets: all build build-release restore clean test test-unit test-integration console"
Loading
Loading