types

package
v3.0.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 9, 2024 License: Apache-2.0 Imports: 21 Imported by: 4

Documentation

Index

Constants

View Source
const (
	// OpenFaaSBackend string to identify the OpenFaaS Serverless Backend in the configuration
	OpenFaaSBackend = "openfaas"
	// KnativeBackend string to identify the Knative Serverless Backend in the configuration
	KnativeBackend = "knative"
)
View Source
const (
	// ContainerName name of the service container
	ContainerName = "oscar-container"

	// VolumeName name of the volume for mounting the OSCAR PVC
	VolumeName = "oscar-volume"

	// VolumePath path to mount the OSCAR PVC
	VolumePath = "/oscar/bin"

	// AlpineDirectory name of the Alpine binary directory
	AlpineDirectory = "alpine"

	// ConfigVolumeName name of the volume for mounting the service configMap
	ConfigVolumeName = "oscar-config"

	// ConfigPath path to mount the service configMap
	ConfigPath = "/oscar/config"

	// FDLFileName name of the FDL file to be stored in the service's configMap
	FDLFileName = "function_config.yaml"

	// ScriptFileName name of the user script file to be stored in the service's configMap
	ScriptFileName = "script.sh"

	// PVCName name of the OSCAR PVC
	PVCName = "oscar-pvc"

	// WatchdogName name of the OpenFaaS watchdog binary
	WatchdogName = "fwatchdog"

	// WatchdogProcess name of the environment variable used by the watchdog to handle requests
	WatchdogProcess = "fprocess"

	// SupervisorName name of the FaaS Supervisor binary
	SupervisorName = "supervisor"

	// ServiceLabel label for deploying services in all backs
	ServiceLabel = "oscar_service"

	// EventVariable name used by the environment variable where events are stored
	EventVariable = "EVENT"

	// JobUUIDVariable name used by the environment variable of the job UUID
	JobUUIDVariable = "JOB_UUID"

	// OpenfaasZeroScalingLabel label to enable zero scaling in OpenFaaS functions
	OpenfaasZeroScalingLabel = "com.openfaas.scale.zero"

	// YunikornApplicationIDLabel label to define the Yunikorn's application ID
	YunikornApplicationIDLabel = "applicationId"

	// YunikornQueueLabel label to define the Yunikorn's queue
	YunikornQueueLabel = "queue"

	// YunikornOscarQueue name of the Yunikorn's queue used for OSCAR services
	YunikornOscarQueue = "oscar-queue"

	// YunikornRootQueue name of the root Yunikorn's queue
	YunikornRootQueue = "root"

	// YunikornDefaultPartition name of the default Yunikorn partition
	YunikornDefaultPartition = "default"

	// KnativeVisibilityLabel name of the knative visibility label
	KnativeVisibilityLabel = "networking.knative.dev/visibility"

	// KnativeClusterLocalValue cluster-local value for the visibility label
	KnativeClusterLocalValue = "cluster-local"

	// KnativeMinScaleAnnotation annotation key to set the minimum number of replicas for a Knative service
	KnativeMinScaleAnnotation = "autoscaling.knative.dev/min-scale"

	// KnativeMaxScaleAnnotation annotation key to set the maximum number of replicas for a Knative service
	KnativeMaxScaleAnnotation = "autoscaling.knative.dev/max-scale"

	// ReSchedulerLabelKey label key to enable/disable the ReScheduler
	ReSchedulerLabelKey = "oscar_rescheduler"
)
View Source
const (
	// DefaultProvider string identifier for the default StorageProvider
	DefaultProvider = "default"

	// MinIOName string representing the MinIO provider name
	MinIOName = "minio"

	// S3Name string representing the S3 provider name
	S3Name = "s3"

	// OnedataName string representing the Onedata provider name
	OnedataName = "onedata"

	// WebDavName string representing a storage provider accessed via webdav
	WebDavName = "webdav"

	// ProviderSeparator separator character used to split provider's name and identifier
	ProviderSeparator = "."
)

Variables

View Source
var YAMLMarshal = yaml.Marshal

YAMLMarshal package-level yaml marshal function

Functions

func ConvertEnvVars

func ConvertEnvVars(vars map[string]string) []v1.EnvVar

func SetImagePullSecrets

func SetImagePullSecrets(secrets []string) []v1.LocalObjectReference

func SetSecurityContext

func SetSecurityContext(podSpec *v1.PodSpec)

Types

type Cluster

type Cluster struct {
	// Endpoint endpoint of the OSCAR cluster API
	Endpoint string `json:"endpoint"`
	// AuthUser username to connect to the cluster (basic auth)
	AuthUser string `json:"auth_user"`
	// AuthPassword password to connect to the cluster (basic auth)
	AuthPassword string `json:"auth_password"`
	// SSLVerify parameter to enable or disable the verification of SSL certificates
	SSLVerify bool `json:"ssl_verify"`
}

Cluster struct to store cluster access data

type Config

type Config struct {
	// MinIOProvider access info
	MinIOProvider *MinIOProvider `json:"-"`

	// Basic auth username
	Username string `json:"-"`

	// Basic auth password
	Password string `json:"-"`

	// Kubernetes name for the deployment and service (default: oscar)
	Name string `json:"name"`

	// Kubernetes namespace for the deployment and service (default: oscar)
	Namespace string `json:"namespace"`

	// Kubernetes namespace for services and jobs (default: oscar-svc)
	ServicesNamespace string `json:"services_namespace"`

	// Parameter used to check if the cluster have GPUs
	GPUAvailable bool `json:"gpu_available"`

	// Port used for the ClusterIP k8s service (default: 8080)
	ServicePort int `json:"-"`

	// Serverless framework used to deploy services (Openfaas | Knative)
	// If not defined only async invocations allowed (Using KubeBackend)
	ServerlessBackend string `json:"serverless_backend,omitempty"`

	// OpenfaasNamespace namespace where the OpenFaaS gateway is deployed
	OpenfaasNamespace string `json:"-"`

	// OpenfaasPort service port where the OpenFaaS gateway is exposed
	OpenfaasPort int `json:"-"`

	// OpenfaasBasicAuthSecret name of the secret used to store the OpenFaaS credentials
	OpenfaasBasicAuthSecret string `json:"-"`

	// OpenfaasPrometheusPort service port where the OpenFaaS' Prometheus is exposed
	OpenfaasPrometheusPort int `json:"-"`

	// OpenfaasScalerEnable option to enable the Openfaas scaler
	OpenfaasScalerEnable bool `json:"-"`

	// OpenfaasScalerInterval time interval to check if any function could be scaled
	OpenfaasScalerInterval string `json:"-"`

	// OpenfaasScalerInactivityDuration
	OpenfaasScalerInactivityDuration string `json:"-"`

	// WatchdogMaxInflight
	WatchdogMaxInflight int `json:"-"`

	// WatchdogWriteDebug
	WatchdogWriteDebug bool `json:"-"`

	// WatchdogExecTimeout
	WatchdogExecTimeout int `json:"-"`

	// WatchdogReadTimeout
	WatchdogReadTimeout int `json:"-"`

	// WatchdogWriteTimeout
	WatchdogWriteTimeout int `json:"-"`

	// WatchdogHealthCheckInterval
	WatchdogHealthCheckInterval int `json:"-"`

	// HTTP timeout for reading the payload (default: 300)
	ReadTimeout time.Duration `json:"-"`

	// HTTP timeout for writing the response (default: 300)
	WriteTimeout time.Duration `json:"-"`

	// YunikornEnable option to configure Apache Yunikorn
	YunikornEnable bool `json:"yunikorn_enable"`

	// YunikornNamespace
	YunikornNamespace string `json:"-"`

	// YunikornConfigMap
	YunikornConfigMap string `json:"-"`

	// YunikornConfigFileName
	YunikornConfigFileName string `json:"-"`

	// ResourceManagerEnable option to enable the Resource Manager to delegate jobs
	// when there are no available resources in the cluster (if the service has replicas)
	ResourceManagerEnable bool `json:"-"`

	// ResourceManagerInterval time interval (in seconds) to update the available resources in the cluster
	ResourceManagerInterval int `json:"-"`

	// ReSchedulerEnable option to enable the ReScheduler to delegate jobs to a replica
	// when a threshold is reached
	ReSchedulerEnable bool `json:"-"`

	// ReSchedulerInterval time interval (in seconds) to check if pending jobs
	ReSchedulerInterval int `json:"-"`

	// ReSchedulerThreshold default time (in seconds) that a job (with replicas) can be queued before delegating it
	ReSchedulerThreshold int `json:"-"`

	// OIDCEnable parameter to enable OIDC support
	OIDCEnable bool `json:"-"`

	// OIDCIssuer OpenID Connect issuer as returned in the "iss" field of the JWT payload
	OIDCIssuer string `json:"-"`

	// OIDCSubject OpenID Connect Subject (user identifier)
	OIDCSubject string `json:"-"`

	// OIDCGroups OpenID comma-separated group list to grant access in the cluster.
	// Groups defined in the "eduperson_entitlement" OIDC scope,
	// as described here: https://docs.egi.eu/providers/check-in/sp/#10-groups
	OIDCGroups []string `json:"-"`

	//
	IngressHost string `json:"-"`
}

Config stores the configuration for the OSCAR server

func ReadConfig

func ReadConfig() (*Config, error)

ReadConfig reads environment variables to create the OSCAR server configuration

func (*Config) CheckAvailableGPUs

func (cfg *Config) CheckAvailableGPUs(kubeClientset kubernetes.Interface)

CheckAvailableGPUs checks if there are "nvidia.com/gpu" resources in the cluster

type Info

type Info struct {
	Version               string                 `json:"version"`
	GitCommit             string                 `json:"git_commit"`
	Architecture          string                 `json:"architecture"`
	KubeVersion           string                 `json:"kubernetes_version"`
	ServerlessBackendInfo *ServerlessBackendInfo `json:"serverless_backend,omitempty"`
}

Info represents the system information to be exposed

type JobInfo

type JobInfo struct {
	Status       string       `json:"status"`
	CreationTime *metav1.Time `json:"creation_time,omitempty"`
	StartTime    *metav1.Time `json:"start_time,omitempty"`
	FinishTime   *metav1.Time `json:"finish_time,omitempty"`
}

JobInfo details the current status of a service's job

type MinIOProvider

type MinIOProvider struct {
	Endpoint  string `json:"endpoint"`
	Verify    bool   `json:"verify"`
	AccessKey string `json:"access_key"`
	SecretKey string `json:"secret_key"`
	Region    string `json:"region"`
}

MinIOProvider stores the credentials of the MinIO storage provider

func (MinIOProvider) GetS3Client

func (minIOProvider MinIOProvider) GetS3Client() *s3.S3

GetS3Client creates a new S3 Client from a MinIOProvider

type OnedataProvider

type OnedataProvider struct {
	OneproviderHost string `json:"oneprovider_host"`
	Token           string `json:"token"`
	Space           string `json:"space"`
}

OnedataProvider stores the credentials of the Onedata storage provider

func (OnedataProvider) GetCDMIClient

func (onedataProvider OnedataProvider) GetCDMIClient() *cdmi.Client

GetCDMIClient creates a new CDMI Client from a OnedataProvider

type Replica

type Replica struct {
	// Type of the replica to re-send events (can be "oscar" or "endpoint")
	Type string `json:"type"`
	// ClusterID identifier of the cluster as defined in the "clusters" FDL field
	// Only used if Type is "oscar"
	ClusterID string `json:"cluster_id"`
	// ServiceName name of the service in the replica cluster.
	// Only used if Type is "oscar"
	ServiceName string `json:"service_name"`
	// URL url of the endpoint to re-send events (HTTP POST).
	// Only used if Type is "endpoint"
	URL string `json:"url"`
	// SSLVerify parameter to enable or disable the verification of SSL certificates.
	// Only used if Type is "endpoint"
	// Optional. (default: true)
	SSLVerify bool `json:"ssl_verify"`
	// Priority value to define delegation priority. Highest priority is defined as 0.
	// If a delegation fails, OSCAR will try to delegate to another replica with lower priority
	// Optional. (default: 0)
	Priority uint `json:"priority"`
	// Headers headers to send in delegation requests
	// Optional
	Headers map[string]string `json:"headers"`
}

Replica struct to define service's replicas in other clusters or endpoints

type ReplicaList

type ReplicaList []Replica

ReplicaList list of replicas implementing sort.Interface

func (ReplicaList) Len

func (rl ReplicaList) Len() int

Len method to implement sort.Interface

func (ReplicaList) Less

func (rl ReplicaList) Less(i, j int) bool

Less method to implement sort.Interface ordering by Replica.Priority

func (ReplicaList) Swap

func (rl ReplicaList) Swap(i, j int)

Swap method to implement sort.Interface

type S3Provider

type S3Provider struct {
	AccessKey string `json:"access_key"`
	SecretKey string `json:"secret_key"`
	Region    string `json:"region"`
}

S3Provider stores the credentials of the AWS S3 storage provider

func (S3Provider) GetS3Client

func (s3Provider S3Provider) GetS3Client() *s3.S3

GetS3Client creates a new S3 Client from a S3Provider

type ServerlessBackend

type ServerlessBackend interface {
	GetInfo() *ServerlessBackendInfo
	ListServices() ([]*Service, error)
	CreateService(service Service) error
	ReadService(name string) (*Service, error)
	UpdateService(service Service) error
	DeleteService(name string) error
	GetKubeClientset() kubernetes.Interface
}

ServerlessBackend define an interface for OSCAR's backends

type ServerlessBackendInfo

type ServerlessBackendInfo struct {
	Name    string `json:"name"`
	Version string `json:"version"`
}

ServerlessBackendInfo shows the name and version of the underlying serverless backend

type Service

type Service struct {
	// Name the name of the service
	Name string `json:"name" binding:"required,max=39,min=1"`

	// ClusterID identifier for the current cluster, used to specify the cluster's StorageProvider in job delegations
	// Optional. (default: ""). OSCAR-CLI sets it using the ClusterID from the FDL
	ClusterID string `json:"cluster_id"`

	// Memory memory limit for the service following the kubernetes format
	// https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/#meaning-of-memory
	// Optional. (default: 256Mi)
	Memory string `json:"memory"`

	// CPU cpu limit for the service following the kubernetes format
	// https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/#meaning-of-cpu
	// Optional. (default: 0.2)
	CPU string `json:"cpu"`

	// TotalMemory limit for the memory used by all the service's jobs running simultaneously
	// Apache YuniKorn scheduler is required to work
	// Same format as Memory, but internally translated to MB (integer)
	// Optional. (default: "")
	TotalMemory string `json:"total_memory"`

	// TotalCPU limit for the virtual CPUs used by all the service's jobs running simultaneously
	// Apache YuniKorn scheduler is required to work
	// Same format as CPU, but internally translated to millicores (integer)
	// Optional. (default: "")
	TotalCPU string `json:"total_cpu"`

	// EnableGPU parameter to request gpu usage in service's executions (synchronous and asynchronous)
	// Optional. (default: false)
	EnableGPU bool `json:"enable_gpu"`

	// EnableSGX parameter to use the SCONE k8s plugin
	// Optional. (default: false)
	EnableSGX bool `json:"enable_sgx"`

	// ImagePrefetch parameter to enable the image cache functionality
	// Optional. (default: false)
	ImagePrefetch bool `json:"image_prefetch"`

	// Synchronous struct to configure specific sync parameters
	// Only Knative ServerlessBackend applies this settings
	// Optional.
	Synchronous struct {
		// MinScale minimum number of active replicas (pods) for the service
		// Optional. (default: 0)
		MinScale int `json:"min_scale"`
		// MaxScale maximum number of active replicas (pods) for the service
		// Optional. (default: 0 [Unlimited])
		MaxScale int `json:"max_scale"`
	} `json:"synchronous"`

	// Replicas list of replicas to delegate jobs
	// Optional
	Replicas ReplicaList `json:"replicas,omitempty"`

	// ReSchedulerThreshold time (in seconds) that a job (with replicas) can be queued before delegating it
	// Optional
	ReSchedulerThreshold int `json:"rescheduler_threshold"`

	// LogLevel log level for the FaaS Supervisor
	// Optional. (default: INFO)
	LogLevel string `json:"log_level"`

	// Image Docker image for the service
	Image string `json:"image" binding:"required"`

	// Alpine parameter to set if image is based on Alpine
	// A custom release of faas-supervisor will be used
	// Optional. (default: false)
	Alpine bool `json:"alpine"`

	// Token token for sync and async invocations
	// Read only. This field is automatically generated by OSCAR
	Token string `json:"token"`

	// A parameter to disable the download of input files by the FaaS Supervisor
	// Optional. (default: false)
	FileStageIn bool `json:"file_stage_in"`

	// Input StorageIOConfig slice with the input service configuration
	// Optional
	Input []StorageIOConfig `json:"input"`

	// Output StorageIOConfig slice with the output service configuration
	// Optional
	Output []StorageIOConfig `json:"output"`

	// Script the user script to execute when the service is invoked
	Script string `json:"script,omitempty" binding:"required"`

	// ImagePullSecrets list of Kubernetes secrets to login to a private registry
	// Optional
	ImagePullSecrets []string `json:"image_pull_secrets,omitempty"`

	Expose struct {
		MinScale     int32 `json:"min_scale" default:"1"`
		MaxScale     int32 `json:"max_scale" default:"10"`
		Port         int   `json:"port" `
		CpuThreshold int32 `json:"cpu_threshold" default:"80" `
	} `json:"expose"`

	// The user-defined environment variables assigned to the service
	// Optional
	Environment struct {
		Vars map[string]string `json:"Variables"`
	} `json:"environment"`

	// Annotations user-defined Kubernetes annotations to be set in job's definition
	// https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
	// Optional
	Annotations map[string]string `json:"annotations"`

	// Parameter to specify the VO from the user creating the service
	// Optional
	VO string `json:"vo"`

	// Labels user-defined Kubernetes labels to be set in job's definition
	// https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
	// Optional
	Labels map[string]string `json:"labels"`

	// StorageProviders configuration for the storage providers used by the service
	// Optional. (default: MinIOProvider["default"] with the server's config credentials)
	StorageProviders *StorageProviders `json:"storage_providers,omitempty"`

	// Clusters configuration for the OSCAR clusters that can be used as service's replicas
	// Optional
	Clusters map[string]Cluster `json:"clusters,omitempty"`

	// List of EGI UID's identifying the users that will have visibility of the service and its MinIO storage provider
	// Optional (If the list is empty we asume the visibility is public for all cluster users)
	AllowedUsers []string `json:"allowed_users"`
}

Service represents an OSCAR service following the SCAR Function Definition Language

func (*Service) GetMinIOWebhookARN

func (service *Service) GetMinIOWebhookARN() string

GetMinIOWebhookARN returns the MinIO's notify_webhook ARN for the specified function

func (*Service) GetSupervisorPath

func (service *Service) GetSupervisorPath() string

GetSupervisorPath returns the appropriate supervisor path

func (*Service) HasReplicas

func (service *Service) HasReplicas() bool

HasReplicas checks if the service has replicas defined

func (*Service) ToPodSpec

func (service *Service) ToPodSpec(cfg *Config) (*v1.PodSpec, error)

ToPodSpec returns a k8s podSpec from the Service

func (Service) ToYAML

func (service Service) ToYAML() (string, error)

ToYAML returns the service as a Function Definition Language YAML

type StorageIOConfig

type StorageIOConfig struct {
	// Provider reference to the provider's name and identifier specified in StorageProviders
	// The provider's name is separated from the ID by a point (e.g. "minio.myidentifier")
	Provider string   `json:"storage_provider"`
	Path     string   `json:"path"`
	Suffix   []string `json:"suffix,omitempty"`
	Prefix   []string `json:"prefix,omitempty"`
}

StorageIOConfig provides the storage input/output configuration for services

type StorageProviders

type StorageProviders struct {
	S3      map[string]*S3Provider      `json:"s3,omitempty"`
	MinIO   map[string]*MinIOProvider   `json:"minio,omitempty"`
	Onedata map[string]*OnedataProvider `json:"onedata,omitempty"`
	WebDav  map[string]*WebDavProvider  `json:"webdav,omitempty"`
}

StorageProviders stores the credentials of all supported storage providers

type SyncBackend

type SyncBackend interface {
	ServerlessBackend
	GetProxyDirector(serviceName string) func(req *http.Request)
}

SyncBackend define an interface for serverless backends that allow sync invocations

type WebDavProvider

type WebDavProvider struct {
	Hostname string `json:"hostname"`
	Login    string `json:"login"`
	Password string `json:"password"`
}

WebDavProvider stores the credentials of the a storage provider that can be accessed via webdav

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL