Phase 1 Implementation - Core SDK foundation with typed APIs: ## New Components Added: - **SDK Package Structure**: `/sdk/client`, `/sdk/internal/http`, `/sdk/examples` - **Core Types**: App, AppInstance, Cloudlet with JSON marshaling - **HTTP Transport**: Resilient HTTP client with go-retryablehttp - **Auth System**: Pluggable providers (StaticToken, NoAuth) - **Client**: Configurable SDK client with retry and logging options ## API Implementation: - **App Management**: CreateApp, ShowApp, ShowApps, DeleteApp - **Error Handling**: Structured APIError with status codes and messages - **Response Parsing**: EdgeXR streaming JSON response support - **Context Support**: All APIs accept context.Context for timeouts/cancellation ## Testing & Examples: - **Unit Tests**: Comprehensive test suite with httptest mock servers - **Example App**: Complete app lifecycle demonstration in examples/deploy_app.go - **Test Coverage**: Create, show, list, delete operations with error conditions ## Build Infrastructure: - **Makefile**: Automated code generation, testing, and building - **Dependencies**: Added go-retryablehttp, testify, oapi-codegen - **Configuration**: oapi-codegen.yaml for type generation ## API Mapping: - CreateApp → POST /auth/ctrl/CreateApp - ShowApp → POST /auth/ctrl/ShowApp - DeleteApp → POST /auth/ctrl/DeleteApp Following existing prototype patterns while adding type safety, retry logic, and comprehensive error handling. Ready for Phase 2 AppInstance APIs. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
46 lines
No EOL
1.3 KiB
Go
46 lines
No EOL
1.3 KiB
Go
// ABOUTME: Authentication providers for EdgeXR Master Controller API
|
|
// ABOUTME: Supports Bearer token authentication with pluggable provider interface
|
|
|
|
package client
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
)
|
|
|
|
// AuthProvider interface for attaching authentication to requests
|
|
type AuthProvider interface {
|
|
// Attach adds authentication headers to the request
|
|
Attach(ctx context.Context, req *http.Request) error
|
|
}
|
|
|
|
// StaticTokenProvider implements Bearer token authentication with a fixed token
|
|
type StaticTokenProvider struct {
|
|
Token string
|
|
}
|
|
|
|
// NewStaticTokenProvider creates a new static token provider
|
|
func NewStaticTokenProvider(token string) *StaticTokenProvider {
|
|
return &StaticTokenProvider{Token: token}
|
|
}
|
|
|
|
// Attach adds the Bearer token to the request Authorization header
|
|
func (s *StaticTokenProvider) Attach(ctx context.Context, req *http.Request) error {
|
|
if s.Token != "" {
|
|
req.Header.Set("Authorization", "Bearer "+s.Token)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// NoAuthProvider implements no authentication (for testing or public endpoints)
|
|
type NoAuthProvider struct{}
|
|
|
|
// NewNoAuthProvider creates a new no-auth provider
|
|
func NewNoAuthProvider() *NoAuthProvider {
|
|
return &NoAuthProvider{}
|
|
}
|
|
|
|
// Attach does nothing (no authentication)
|
|
func (n *NoAuthProvider) Attach(ctx context.Context, req *http.Request) error {
|
|
return nil
|
|
} |