Documentation ¶
Index ¶
- Constants
- Variables
- func BuildTrackedResource(ctx context.Context) v1.TrackedResource
- func GetNextLinkURL(ctx context.Context, req *http.Request, paginationToken string) string
- func GetURLFromReqWithQueryParameters(req *http.Request, qps url.Values) *url.URL
- func ReadJSONBody(r *http.Request) ([]byte, error)
- func UpdateSystemData(old v1.SystemData, new v1.SystemData) v1.SystemData
- func ValidateETag(armRequestContext v1.ARMRequestContext, etag string) error
- type BaseController
- func (b *BaseController) DataProvider() dataprovider.DataStorageProvider
- func (c *BaseController) GetResource(ctx context.Context, id string, out any) (etag string, err error)
- func (b *BaseController) KubeClient() runtimeclient.Client
- func (b *BaseController) ResourceType() string
- func (c *BaseController) SaveResource(ctx context.Context, id string, in any, etag string) (*store.Object, error)
- func (b *BaseController) StatusManager() sm.StatusManager
- func (b *BaseController) StorageClient() store.StorageClient
- type Controller
- type DeleteFilter
- type Operation
- func (b *Operation[P, T]) AsyncOperationTimeout() time.Duration
- func (c *Operation[P, T]) ConstructAsyncResponse(ctx context.Context, method, etag string, resource *T) (rest.Response, error)
- func (c *Operation[P, T]) ConstructSyncResponse(ctx context.Context, method, etag string, resource *T) (rest.Response, error)
- func (b *Operation[P, T]) DataProvider() dataprovider.DataStorageProvider
- func (b *Operation[P, T]) DeleteFilters() []DeleteFilter[T]
- func (c *Operation[P, T]) GetResource(ctx context.Context, id resources.ID) (out *T, etag string, err error)
- func (c *Operation[P, T]) GetResourceFromRequest(ctx context.Context, req *http.Request) (*T, error)
- func (b *Operation[P, T]) Options() *Options
- func (c *Operation[P, T]) PrepareAsyncOperation(ctx context.Context, newResource *T, initialState v1.ProvisioningState, ...) (rest.Response, error)
- func (c *Operation[P, T]) PrepareResource(ctx context.Context, req *http.Request, newResource *T, oldResource *T, ...) (rest.Response, error)
- func (b *Operation[P, T]) RequestConverter() v1.ConvertToDataModel[T]
- func (b *Operation[P, T]) ResourceType() string
- func (b *Operation[P, T]) ResponseConverter() v1.ConvertToAPIModel[T]
- func (c *Operation[P, T]) SaveResource(ctx context.Context, id string, in *T, etag string) (string, error)
- func (b *Operation[P, T]) StatusManager() sm.StatusManager
- func (b *Operation[P, T]) StorageClient() store.StorageClient
- func (b *Operation[P, T]) UpdateFilters() []UpdateFilter[T]
- type Options
- type ResourceOptions
- type UpdateFilter
Constants ¶
const (
// InProgressStateMessageFormat represents the message when resource is in progress state.
InProgressStateMessageFormat = "The target resource is in progress state: %s."
)
Variables ¶
var ( // ContentTypeHeaderKey is the header key of Content-Type ContentTypeHeaderKey = http.CanonicalHeaderKey("Content-Type") // DefaultScheme is the default scheme used if there is no scheme in the URL. DefaultSheme = "http" )
var ( // ErrUnsupportedContentType represents the error of unsupported content-type. ErrUnsupportedContentType = errors.New("unsupported Content-Type") // ErrRequestedResourceDoesNotExist represents the error of resource that is requested not existing. ErrRequestedResourceDoesNotExist = errors.New("requested resource does not exist") // ErrETagsDoNotMatch represents the error of the eTag of the resource and the requested etag not matching. ErrETagsDoNotMatch = errors.New("etags do not match") // ErrResourceAlreadyExists represents the error of the resource being already existent at the moment. ErrResourceAlreadyExists = errors.New("resource already exists") )
Functions ¶
func BuildTrackedResource ¶
func BuildTrackedResource(ctx context.Context) v1.TrackedResource
BuildTrackedResource takes in a context and returns a v1.TrackedResource object with the ID, Name, Type and Location fields populated from the context.
func GetNextLinkURL ¶
GetNextLinkUrl function returns the URL string by building a URL from the request and the pagination token.
func GetURLFromReqWithQueryParameters ¶
GetURLFromReqWithQueryParameters function builds a URL from the request and query parameters
func ReadJSONBody ¶
ReadJSONBody extracts the content from request - it reads the body of the request if the content type is "application/json". It returns the body as a byte array or an error if the content type is not supported or an error occurs while reading the body.
func UpdateSystemData ¶
func UpdateSystemData(old v1.SystemData, new v1.SystemData) v1.SystemData
UpdateSystemData updates the system data fields in the old object with the new object's fields, backfilling the created fields if necessary.
func ValidateETag ¶
func ValidateETag(armRequestContext v1.ARMRequestContext, etag string) error
ValidateETag checks the If-Match and If-None-Match headers of the ARMRequestContext against the provided etag, and returns an error if the etag does not match either header.
Types ¶
type BaseController ¶
type BaseController struct {
// contains filtered or unexported fields
}
BaseController is the base operation controller.
func NewBaseController ¶
func NewBaseController(options Options) BaseController
NewBaseController creates BaseController instance.
func (*BaseController) DataProvider ¶
func (b *BaseController) DataProvider() dataprovider.DataStorageProvider
DataProvider gets data storage provider for this controller.
func (*BaseController) GetResource ¶
func (c *BaseController) GetResource(ctx context.Context, id string, out any) (etag string, err error)
GetResource gets a resource from data store for id, set the retrieved resource to out argument and returns the ETag of the resource and an error if one occurs.
func (*BaseController) KubeClient ¶
func (b *BaseController) KubeClient() runtimeclient.Client
KubeClient gets Kubernetes client for this controller.
func (*BaseController) ResourceType ¶
func (b *BaseController) ResourceType() string
ResourceType gets the resource type for this controller.
func (*BaseController) SaveResource ¶
func (c *BaseController) SaveResource(ctx context.Context, id string, in any, etag string) (*store.Object, error)
SaveResource saves a resource to the data store with an ETag and returns a store object or an error if the save fails.
func (*BaseController) StatusManager ¶
func (b *BaseController) StatusManager() sm.StatusManager
StatusManager gets the StatusManager of this controller.
func (*BaseController) StorageClient ¶
func (b *BaseController) StorageClient() store.StorageClient
StorageClient gets storage client for this controller.
type Controller ¶
type Controller interface { // Run executes the operation. Run(ctx context.Context, w http.ResponseWriter, req *http.Request) (rest.Response, error) }
TODO: Remove Controller when all controller uses Operation Controller is an interface of each operation controller.
type DeleteFilter ¶
type DeleteFilter[T any] func(ctx context.Context, oldResource *T, options *Options) (rest.Response, error)
DeleteFilter is a function that is executed as part of the controller lifecycle. DeleteFilters can be used to:
- Block deletion of a resource based on some arbitrary condition.
DeleteFilters should return a rest.Response to handle the request without allowing deletion to occur. Any errors returned will be treated as "unhandled" and logged before sending back an HTTP 500.
type Operation ¶
type Operation[P interface { *T v1.ResourceDataModel }, T any] struct { // contains filtered or unexported fields }
Operation is the base operation controller.
func NewOperation ¶
func NewOperation[P interface { *T v1.ResourceDataModel }, T any](options Options, resourceOptions ResourceOptions[T]) Operation[P, T]
NewOperation creates BaseController instance.
func (*Operation[P, T]) AsyncOperationTimeout ¶
AsyncOperationTimeout returns the timeput for the operation.
func (*Operation[P, T]) ConstructAsyncResponse ¶
func (c *Operation[P, T]) ConstructAsyncResponse(ctx context.Context, method, etag string, resource *T) (rest.Response, error)
ConstructAsyncResponse creates an asynchronous response for a given resource, method and etag. It converts the resource to the appropriate version and sets the response code to either Accepted or Created depending on the method. It also sets the RetryAfter value if it is specified in the resourceOptions. If an error occurs, it is returned to the caller.
func (*Operation[P, T]) ConstructSyncResponse ¶
func (c *Operation[P, T]) ConstructSyncResponse(ctx context.Context, method, etag string, resource *T) (rest.Response, error)
ConstructSyncResponse constructs synchronous API response.
func (*Operation[P, T]) DataProvider ¶
func (b *Operation[P, T]) DataProvider() dataprovider.DataStorageProvider
DataProvider gets the DataStorageProvider.
func (*Operation[P, T]) DeleteFilters ¶
func (b *Operation[P, T]) DeleteFilters() []DeleteFilter[T]
DeleteFilters returns the set of filters to execute on delete operations.
func (*Operation[P, T]) GetResource ¶
func (c *Operation[P, T]) GetResource(ctx context.Context, id resources.ID) (out *T, etag string, err error)
GetResource is the helper to get the resource via storage client.
func (*Operation[P, T]) GetResourceFromRequest ¶
func (c *Operation[P, T]) GetResourceFromRequest(ctx context.Context, req *http.Request) (*T, error)
GetResourceFromRequest extracts and deserializes from HTTP request body to datamodel.
func (*Operation[P, T]) PrepareAsyncOperation ¶
func (c *Operation[P, T]) PrepareAsyncOperation(ctx context.Context, newResource *T, initialState v1.ProvisioningState, asyncTimeout time.Duration, etag *string) (rest.Response, error)
PrepareAsyncOperation saves the initial state and queue the async operation.
func (*Operation[P, T]) PrepareResource ¶
func (c *Operation[P, T]) PrepareResource(ctx context.Context, req *http.Request, newResource *T, oldResource *T, etag string) (rest.Response, error)
PrepareResource validates incoming request and populate the metadata to new resource.
func (*Operation[P, T]) RequestConverter ¶
func (b *Operation[P, T]) RequestConverter() v1.ConvertToDataModel[T]
RequestConverter returns the request converter function for this controller.
func (*Operation[P, T]) ResourceType ¶
ResourceType gets the resource type for this controller.
func (*Operation[P, T]) ResponseConverter ¶
func (b *Operation[P, T]) ResponseConverter() v1.ConvertToAPIModel[T]
ResponseConverter returns the response converter function for this controller.
func (*Operation[P, T]) SaveResource ¶
func (c *Operation[P, T]) SaveResource(ctx context.Context, id string, in *T, etag string) (string, error)
SaveResource is the helper to save the resource via storage client.
func (*Operation[P, T]) StatusManager ¶
func (b *Operation[P, T]) StatusManager() sm.StatusManager
DeploymentProcessor gets the deployment processor for this controller.
func (*Operation[P, T]) StorageClient ¶
func (b *Operation[P, T]) StorageClient() store.StorageClient
StorageClient gets storage client for this controller.
func (*Operation[P, T]) UpdateFilters ¶
func (b *Operation[P, T]) UpdateFilters() []UpdateFilter[T]
DeleteFilters returns the set of filters to execute on update (PUT/PATCH) operations.
type Options ¶
type Options struct { // Address is the listening address where the controller is running, including the hostname and port. // // For example: "localhost:8080". // // The listening address is provided so that it can be used when constructing URLs. Address string // PathBase is a URL path prefix that is applied to all requests and should not be considered part of request path // for determining routing or parsing of IDs. It must start with a slash or be empty. // // For example consider the following examples that match the resource ID "/planes/radius/local": // // - base path: "/apis/api.ucp.dev/v1alpha3" and URL path: "/apis/api.ucp.dev/planes/radius/local". // - base path: "" (empty) and request path: "/planes/radius/local". // // Code that needs to process the URL path should ignore the base path prefix when parsing the URL path. // Code that needs to construct a URL path should use the base path prefix when constructing the URL path. PathBase string // StorageClient is the data storage client. StorageClient store.StorageClient // DataProvider is the data storage provider. DataProvider dataprovider.DataStorageProvider // KubeClient is the Kubernetes controller runtime client. KubeClient runtimeclient.Client // ResourceType is the string that represents the resource type. May be empty if the controller // does not represent a single type of resource. ResourceType string // StatusManager is the async operation status manager. StatusManager sm.StatusManager }
Options represents controller options.
type ResourceOptions ¶
type ResourceOptions[T any] struct { // RequestConverter is the request converter. RequestConverter v1.ConvertToDataModel[T] // ResponseConverter is the response converter. ResponseConverter v1.ConvertToAPIModel[T] // DeleteFilters is a slice of filters that execute prior to deleting a resource. DeleteFilters []DeleteFilter[T] // UpdateFilters is a slice of filters that execute prior to updating a resource. UpdateFilters []UpdateFilter[T] // AsyncOperationTimeout is the default timeout duration of async put operation. AsyncOperationTimeout time.Duration // AsyncOperationRetryAfter is the value of the Retry-After header that will be used for async operations. // If this is 0 then the default value of v1.DefaultRetryAfter will be used. Consider setting this to a smaller // value like 5 seconds if your operations will complete quickly. AsyncOperationRetryAfter time.Duration // ListRecursiveQuery specifies whether store query should be recursive or not. This should be set to true when the // scope of the list operation does not match the scope of the underlying resource type. // // This is ignored by non-list controllers. ListRecursiveQuery bool }
ResourceOptions represents the options and filters for resource.
type UpdateFilter ¶
type UpdateFilter[T any] func(ctx context.Context, newResource *T, oldResource *T, options *Options) (rest.Response, error)
UpdateFilter is a function that is executed as part of the controller lifecycle. UpdateFilters can be used to:
- Set internal state of a resource data model prior to saving. - Perform semantic validation based on the old state of a resource. - Perform semantic validation based on external state.
UpdateFilters should return a rest.Response to handle the request without allowing updates to occur. Any errors returned will be treated as "unhandled" and logged before sending back an HTTP 500.