controller

package
v0.23.0 Latest Latest
Warning

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

Go to latest
Published: Dec 11, 2025 License: Apache-2.0 Imports: 66 Imported by: 0

Documentation

Index

Constants

View Source
const (
	DomainEventSubdomainAlreadyInUse = "SubdomainAlreadyInUse"
	LabelDomainHostHash              = "sme.sap.com/domain-host-hash"
)
View Source
const (
	ResourceCAPTenant = iota
	ResourceCAPApplicationVersion
	ResourceCAPApplication
	ResourceCAPTenantOperation
	ResourceClusterDomain
	ResourceDomain
	ResourceJob
	ResourceSecret
	ResourceGateway
	ResourceCertificate
	ResourceDNSEntry
	ResourceVirtualService
	ResourceDestinationRule
)
View Source
const (
	CAPOp = "cap_op"
	Queue = "queue"
	// Metrics for workqueue
	Depth                   = "depth"
	Adds                    = "adds_total"
	QueueLatency            = "latency_seconds"
	WorkDuration            = "work_duration_seconds"
	UnfinishedWork          = "unfinished_work_seconds"
	LongestRunningProcessor = "longest_running_processor_seconds"
	Retries                 = "retries_total"
)

Constants for the metrics

View Source
const (
	CAPApplicationEventMissingSecrets               = "MissingSecrets"
	CAPApplicationEventMissingDomainReferences      = "MissingDomainReferences"
	CAPApplicationEventPrimaryGatewayModified       = "PrimaryGatewayModified"
	CAPApplicationEventMissingIngressGatewayInfo    = "MissingIngressGatewayInfo"
	CAPApplicationEventProviderTenantCreated        = "ProviderTenantCreated"
	CAPApplicationEventNewCAVTriggeredTenantUpgrade = "NewCAVTriggeredTenantUpgrade"
)
View Source
const (
	EventActionProcessingSecrets        = "ProcessingSecrets"
	EventActionProviderTenantProcessing = "ProviderTenantProcessing"
	EventActionCheckForVersion          = "CheckForVersion"
)
View Source
const (
	CategoryWorkload       = "Workload"
	CategoryService        = "Service"
	CategoryServiceMonitor = "ServiceMonitor"
)
View Source
const (
	CAPTenantEventProcessingStarted                 = "ProcessingStarted"
	CAPTenantEventProvisioningFailed                = "ProvisioningFailed"
	CAPTenantEventProvisioningCompleted             = "ProvisioningCompleted"
	CAPTenantEventProvisioningOperationCreated      = "ProvisioningOperationCreated"
	CAPTenantEventDeprovisioningFailed              = "DeprovisioningFailed"
	CAPTenantEventDeprovisioningCompleted           = "DeprovisioningCompleted"
	CAPTenantEventDeprovisioningOperationCreated    = "DeprovisioningOperationCreated"
	CAPTenantEventUpgradeFailed                     = "UpgradeFailed"
	CAPTenantEventUpgradeCompleted                  = "UpgradeCompleted"
	CAPTenantEventUpgradeOperationCreated           = "UpgradeOperationCreated"
	CAPTenantEventTenantNetworkingModified          = "TenantNetworkingModified"
	CAPTenantEventVirtualServiceModificationFailed  = "VirtualServiceModificationFailed"
	CAPTenantEventDestinationRuleModificationFailed = "DestinationRuleModificationFailed"
	CAPTenantEventInvalidReference                  = "InvalidReference"
	CAPTenantEventAutoVersionUpdate                 = "AutoVersionUpdate"
)
View Source
const (
	EventActionReconcileTenantNetworking = "ReconcileTenantNetworking"
	EventActionPrepare                   = "Prepare"
	EventActionUpgrade                   = "Upgrade"
)
View Source
const (
	CAPTenantOperationConditionReasonStepProcessing      string = "StepProcessing"
	CAPTenantOperationConditionReasonStepCompleted       string = "StepCompleted"
	CAPTenantOperationConditionReasonStepFailed          string = "StepFailed"
	CAPTenantOperationConditionReasonStepInitiated       string = "StepInitiated"
	CAPTenantOperationConditionReasonStepProcessingError string = "StepProcessingError"
)
View Source
const (
	EventActionCreateJob = "CreateJob"
	EventActionTrackJob  = "TrackJob"
)
View Source
const (
	DomainEventMissingIngressGatewayInfo = "MissingIngressGatewayInfo"
	DomainEventCertificateNotReady       = "CertificateNotReady"
	DomainEventDNSEntriesNotReady        = "DNSEntriesNotReady"
	DomainEventDuplicateDomainHost       = "DuplicateDomainHost"
	EventActionProcessingDomainResources = "ProcessingDomainResources"
	LabelKubernetesServiceName           = "kubernetes.io/service-name"
	LabelKubernetesMetadataName          = "kubernetes.io/metadata.name"
)
View Source
const (
	EventActionReconcileServiceNetworking        = "ReconcileServiceNetworking"
	EventServiceNetworkingModified               = "ServiceNetworkingModified"
	EventServiceVirtualServiceModificationFailed = "ServiceVirtualServiceModificationFailed"
)
View Source
const (
	LabelOwnerIdentifierHash            = "sme.sap.com/owner-identifier-hash"
	LabelOwnerGeneration                = "sme.sap.com/owner-generation"
	LabelWorkloadName                   = "sme.sap.com/workload-name"
	LabelWorkloadType                   = "sme.sap.com/workload-type"
	LabelResourceCategory               = "sme.sap.com/category"
	LabelBTPApplicationIdentifierHash   = "sme.sap.com/btp-app-identifier-hash"
	LabelTenantType                     = "sme.sap.com/tenant-type"
	LabelTenantId                       = "sme.sap.com/btp-tenant-id"
	LabelTenantOperationType            = "sme.sap.com/tenant-operation-type"
	LabelTenantOperationStep            = "sme.sap.com/tenant-operation-step"
	LabelCAVVersion                     = "sme.sap.com/cav-version"
	LabelRelevantDNSTarget              = "sme.sap.com/relevant-dns-target-hash"
	LabelDisableKarydia                 = "x4.sap.com/disable-karydia"
	LabelExposedWorkload                = "sme.sap.com/exposed-workload"
	LabelDNSNameHash                    = "sme.sap.com/dns-name-hash"
	LabelSubscriptionGUID               = "sme.sap.com/subscription-guid"
	AnnotationOwnerIdentifier           = "sme.sap.com/owner-identifier"
	AnnotationBTPApplicationIdentifier  = "sme.sap.com/btp-app-identifier"
	AnnotationResourceHash              = "sme.sap.com/resource-hash"
	AnnotationControllerClass           = "sme.sap.com/controller-class"
	AnnotationIstioSidecarInject        = "sidecar.istio.io/inject"
	AnnotationGardenerDNSTarget         = "dns.gardener.cloud/dnsnames"
	AnnotationKubernetesDNSTarget       = "external-dns.alpha.kubernetes.io/hostname"
	AnnotationSubscriptionContextSecret = "sme.sap.com/subscription-context-secret"
	AnnotationProviderSubAccountId      = "sme.sap.com/provider-sub-account-id"
	AnnotationEnableCleanupMonitoring   = "sme.sap.com/enable-cleanup-monitoring"
	AnnotationVSRouteRequestHeaderSet   = "sme.sap.com/vs-route-request-header-set"  // used to set the header for the vs route request
	AnnotationVSRouteResponseHeaderSet  = "sme.sap.com/vs-route-response-header-set" // used to set the header for the vs route response
	AnnotationLogoutEndpoint            = "sme.sap.com/logout-endpoint"
	AnnotationEnableVersionAffinity     = "sme.sap.com/enable-version-affinity"
	FinalizerCAPApplication             = "sme.sap.com/capapplication"
	FinalizerCAPApplicationVersion      = "sme.sap.com/capapplicationversion"
	FinalizerCAPTenant                  = "sme.sap.com/captenant"
	FinalizerCAPTenantOperation         = "sme.sap.com/captenantoperation"
	FinalizerDomain                     = "sme.sap.com/domain"
	GardenerDNSClassIdentifier          = "dns.gardener.cloud/class"
)
View Source
const (
	CertificateSuffix     = "certificate"
	GardenerDNSClassValue = "garden"
	GatewaySuffix         = "gw"
	IstioSystemNamespace  = "istio-system"
	SecretSuffix          = "secret"
)
View Source
const (
	EnvCAPOpAppVersion          = "CAPOP_APP_VERSION"
	EnvCAPOpTenantId            = "CAPOP_TENANT_ID"
	EnvCAPOpTenantSubDomain     = "CAPOP_TENANT_SUBDOMAIN"
	EnvCAPOpTenantOperation     = "CAPOP_TENANT_OPERATION"
	EnvCAPOpTenantMtxsOperation = "CAPOP_TENANT_MTXS_OPERATION"
	EnvCAPOpTenantType          = "CAPOP_TENANT_TYPE"
	EnvCAPOpAppName             = "CAPOP_APP_NAME"
	EnvCAPOpGlobalAccountId     = "CAPOP_GLOBAL_ACCOUNT_ID"
	EnvCAPOpProviderTenantId    = "CAPOP_PROVIDER_TENANT_ID"
	EnvCAPOpProviderSubDomain   = "CAPOP_PROVIDER_SUBDOMAIN"
	EnvCAPOpSubscriptionPayload = "CAPOP_SUBSCRIPTION_PAYLOAD"
	EnvVCAPServices             = "VCAP_SERVICES"
)
View Source
const (
	ServiceSuffix       = "-svc"
	SubscriptionContext = "subscriptionContext"
)
View Source
const (
	EnvPrometheusAddress                 = "PROMETHEUS_ADDRESS"
	EnvPrometheusAcquireClientRetryDelay = "PROM_ACQUIRE_CLIENT_RETRY_DELAY" // Value should be a duration
	EnvMetricsEvaluationInterval         = "METRICS_EVAL_INTERVAL"
)
View Source
const (
	CAPApplicationVersionEventReadForDeletion = "ReadyForDeletion"
	EventActionEvaluateMetrics                = "EvaluateMetrics"
)
View Source
const (
	GaugeEvaluationExpression   = "sum(avg_over_time(%s{job=\"%s\",namespace=\"%s\"}[%s]))"
	CounterEvaluationExpression = "sum(rate(%s{job=\"%s\",namespace=\"%s\"}[%s]))"
)
View Source
const (
	App = "app"
)
View Source
const (
	CAPTenantOperationEventInvalidReference = "InvalidReference"
)
View Source
const (
	OperatorDomains = "OperatorDomains"
)
View Source
const PodTemplateHashKey = "pod-template-hash"
View Source
const RouterHttpCookieName = "CAPOP_ROUTER_STICKY"

Use a different name for sticky cookie than the one from approuter (JSESSIONID) used for session handling

View Source
const TenantTypeProvider = "provider"
View Source
const (
	VersionAffinityCookieName = "CAPOP_CAV"
)

Variables

View Source
var (
	// Metrics for CROs in Error (Kind along with namespace & name of the CRO)
	ReconcileErrors = prometheus.NewCounterVec(prometheus.CounterOpts{
		Namespace: CAPOp,
		Name:      "reconcile_errors",
		Help:      "Resources that failed to reconcile",
	}, []string{"kind", "namespace", "name"})

	// Metrics for CROs in Panic (namespace-name of the CRO)
	Panics = prometheus.NewCounterVec(prometheus.CounterOpts{
		Namespace: CAPOp,
		Name:      "panics",
		Help:      "Resources that caused a panic",
	}, []string{"kind", "namespace", "name"})

	// Metrics for overall tenant operations
	TenantOperations = prometheus.NewCounterVec(prometheus.CounterOpts{
		Namespace: CAPOp,
		Name:      "tenant_operations",
		Help:      "Overall number of tenant operations",
	}, []string{"app", "operation"})

	// Metrics for TenantOperation Failures (with app, operation, namespace & name of the tenant operation)
	TenantOperationFailures = prometheus.NewCounterVec(prometheus.CounterOpts{
		Namespace: CAPOp,
		Name:      "tenant_operation_failures",
		Help:      "Tenant operations that failed to complete",
	}, []string{"app", "operation", "tenant_id", "namespace", "name"})

	// Metrics for duration of TenantOperations (could help with determining duration of saas provisioning callback for e.g.)
	LastTenantOperationDuration = prometheus.NewGaugeVec(prometheus.GaugeOpts{
		Namespace: CAPOp,
		Name:      "last_tenant_operation_duration_seconds",
		Help:      "Duration of last tenant operation in seconds",
	}, []string{"app", "tenant_id"})

	// Metrics for overall service operations
	ServiceOperations = prometheus.NewCounterVec(prometheus.CounterOpts{
		Namespace: CAPOp,
		Name:      "service_operations",
		Help:      "Overall number of service operations",
	}, []string{"app"})

	// Metrics for overall service operations
	ServiceOperationFailures = prometheus.NewCounterVec(prometheus.CounterOpts{
		Namespace: CAPOp,
		Name:      "service_operation_failures",
		Help:      "Service Operations that failed to complete",
	}, []string{"app", "version", "namespace", "name"})
)
View Source
var TenantOperationStatusMap = map[v1alpha1.CAPTenantOperationType]StatusInfo{
	v1alpha1.CAPTenantOperationTypeProvisioning: {
		// contains filtered or unexported fields
	},
	v1alpha1.CAPTenantOperationTypeUpgrade: {
		// contains filtered or unexported fields
	},
	v1alpha1.CAPTenantOperationTypeDeprovisioning: {
		// contains filtered or unexported fields
	},
}

maps tenant operation types (and their status) to CAPTenant status changes

Functions

This section is empty.

Types

type CAPTenantStateHandlerFunc

type CAPTenantStateHandlerFunc func(ctx context.Context, c *Controller, cat *v1alpha1.CAPTenant, target StateCondition, ctop *v1alpha1.CAPTenantOperation) (*ReconcileResult, error)

type CertificateManager added in v0.15.0

type CertificateManager struct {
	// contains filtered or unexported fields
}

func CreateCertificateManager added in v0.15.0

func CreateCertificateManager(c *Controller) *CertificateManager

func (*CertificateManager) CreateCertificate added in v0.15.0

func (h *CertificateManager) CreateCertificate(ctx context.Context, info *ManagedCertificateInfo) (err error)

func (*CertificateManager) DeleteCertificates added in v0.15.0

func (h *CertificateManager) DeleteCertificates(ctx context.Context, certs []ManagedCertificate) error

func (*CertificateManager) GetCredentialName added in v0.15.0

func (h *CertificateManager) GetCredentialName(namespace, name string) string

func (*CertificateManager) IsCertificateReady added in v0.15.0

func (h *CertificateManager) IsCertificateReady(cert ManagedCertificate) (bool, error)

func (*CertificateManager) ListCertificates added in v0.15.0

func (h *CertificateManager) ListCertificates(ctx context.Context, namespace string, selector labels.Selector) (list []ManagedCertificate, err error)

func (*CertificateManager) RemoveCertificateFinalizers added in v0.15.0

func (h *CertificateManager) RemoveCertificateFinalizers(ctx context.Context, certs []ManagedCertificate) (err error)

func (*CertificateManager) UpdateCertificate added in v0.15.0

func (h *CertificateManager) UpdateCertificate(ctx context.Context, cert ManagedCertificate, info *ManagedCertificateInfo) (err error)

type Controller

type Controller struct {
	// contains filtered or unexported fields
}

func NewController

func NewController(client kubernetes.Interface, crdClient versioned.Interface, istioClient istio.Interface, gardenerCertificateClient gardenerCert.Interface, certManagerCertificateClient certManager.Interface, gardenerDNSClient gardenerDNS.Interface, promClient promop.Interface) *Controller

func (*Controller) Event

func (c *Controller) Event(main runtime.Object, related runtime.Object, eventType, reason, action, message string)

func (*Controller) Start

func (c *Controller) Start(ctx context.Context)

type DeploymentParameters

type DeploymentParameters struct {
	CA              *v1alpha1.CAPApplication
	CAV             *v1alpha1.CAPApplicationVersion
	OwnerRef        *metav1.OwnerReference
	WorkloadDetails v1alpha1.WorkloadDetails
	VCAPSecretName  string
}

type IdentifiedCAPTenantOperations

type IdentifiedCAPTenantOperations struct {
	// contains filtered or unexported fields
}

type JobState

type JobState string
const (
	JobStateComplete   JobState = "Complete"
	JobStateFailed     JobState = "Failed"
	JobStateProcessing JobState = "Processing"
)

type ManagedCertificate added in v0.15.0

type ManagedCertificate interface {
	GetAnnotations() map[string]string
	GetName() string
	GetNamespace() string
	GetLabels() map[string]string
}

type ManagedCertificateInfo added in v0.15.0

type ManagedCertificateInfo struct {
	Domain              string
	Name                string
	Namespace           string
	CredentialName      string
	CredentialNamespace string
	OwnerId             string
	OwnerGeneration     int64
}

func (*ManagedCertificateInfo) Hash added in v0.15.0

func (o *ManagedCertificateInfo) Hash() string

type NamespacedResourceKey

type NamespacedResourceKey struct {
	Namespace string
	Name      string
}

type ProvisioningPayload

type ProvisioningPayload struct {
	SubscribedSubdomain string `json:"subscribedSubdomain"`
	EventType           string `json:"eventType"`
}

type QueueItem

type QueueItem struct {
	Key         int
	ResourceKey NamespacedResourceKey
}

type ReconcileResult

type ReconcileResult struct {
	// contains filtered or unexported fields
}

func NewReconcileResult

func NewReconcileResult() *ReconcileResult

func NewReconcileResultWithResource

func NewReconcileResultWithResource(rid int, resourceName string, resourceNamespace string, requeueAfter time.Duration) *ReconcileResult

func (*ReconcileResult) AddResource

func (r *ReconcileResult) AddResource(rid int, resourceName string, resourceNamespace string, after time.Duration)

type RequeueItem

type RequeueItem struct {
	// contains filtered or unexported fields
}

type RouterDestination

type RouterDestination struct {
	Name                 string `json:"name"`
	URL                  string `json:"url"`
	ProxyHost            string `json:"proxyHost,omitempty"`
	ProxyPort            string `json:"proxyPort,omitempty"`
	ForwardAuthToken     bool   `json:"forwardAuthToken,omitempty"`
	StrictSSL            bool   `json:"strictSSL,omitempty"`
	Timeout              *int64 `json:"timeout,omitempty"`
	SetXForwardedHeaders bool   `json:"setXForwardedHeaders,omitempty"`
	ProxyType            string `json:"proxyType,omitempty"`
}

See https://www.npmjs.com/package/@sap/approuter#destinations

type StateCondition

type StateCondition struct {
	// contains filtered or unexported fields
}

type StatusInfo

type StatusInfo struct {
	// contains filtered or unexported fields
}

type Steps added in v0.7.0

type Steps string
const (
	Processing     Steps = "Processing"
	Provisioning   Steps = "Provisioning"
	Upgrading      Steps = "Upgrading"
	Deprovisioning Steps = "Deprovisioning"
	Deleting       Steps = "Deleting"
	Ready          Steps = "Ready"
	Error          Steps = "Error"
)

type TargetStateHandler

type TargetStateHandler struct {
	// contains filtered or unexported fields
}

type UpgradePayload

type UpgradePayload struct {
	Tenants      []string `json:"tenants"`
	AutoUnDeploy bool     `json:"autoUndeploy"`
}

Jump to

Keyboard shortcuts

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