Documentation
¶
Overview ¶
+kubebuilder:object:generate=true
Index ¶
- Constants
- Variables
- type ArchiveReason
- type ComponentDefinition
- type ComponentType
- type Data
- type DataDetails
- type DataKey
- type DataProvider
- type DataSourceKind
- type Dependency
- type Details
- type EnvSchema
- type EnvTemplate
- type EnvVarDefinition
- type EnvVarSchema
- type EnvVarType
- type EventType
- type FollowRedirects
- type Object
- type Problem
- type ProblemSource
- type ProblemSourceKind
- type ProblemType
- type Problems
- type ReleaseType
- type RouteSpec
- type Val
- func (val *Val) Any() any
- func (val *Val) ArrayFloat() []float64
- func (val *Val) ArrayInt() []int
- func (val *Val) ArrayString() []string
- func (val *Val) Bool() bool
- func (val *Val) BoolDef(def bool) bool
- func (in *Val) DeepCopy() *Val
- func (in *Val) DeepCopyInto(out *Val)
- func (val *Val) EnvVarType() EnvVarType
- func (val *Val) Equals(rhs *Val) bool
- func (val *Val) Float() float64
- func (val *Val) FloatDef(def float64) float64
- func (val *Val) Int() int
- func (val *Val) IntDef(def int) int
- func (val *Val) IsArrayNumber() bool
- func (val *Val) IsArrayString() bool
- func (val *Val) IsBool() bool
- func (val *Val) IsEmpty() bool
- func (val *Val) IsNil() bool
- func (val *Val) IsNumber() bool
- func (val *Val) IsString() bool
- func (val *Val) IsUnknown() bool
- func (val *Val) MarshalJSON() ([]byte, error)
- func (val *Val) Proto() *structpb.Value
- func (val *Val) String() string
- func (val *Val) StringDef(def string) string
- func (val *Val) UnmarshalJSON(value []byte) error
- type ValType
Constants ¶
const ( SecretMask = "••••••" MaxEventSizeBytesLimit = 16777216 // 16 MiB )
Misc
const ( DefaultLogFormat = "json" DefaultLogLevel = "info" DefaultMaxEventSizeBytes = 5242880 // 5 MiB DefaultReleaseActivationDeadlineSeconds = 300 // 5 mins DefaultReleaseHistoryAgeLimit = 0 DefaultReleaseHistoryCountLimit = 10 DefaultTimeoutSeconds = 30 )
Defaults
const ( LabelK8sAppBranch string = "kubefox.xigxog.io/app-branch" LabelK8sAppCommit string = "kubefox.xigxog.io/app-commit" LabelK8sAppCommitShort string = "kubefox.xigxog.io/app-commit-short" LabelK8sAppName string = "app.kubernetes.io/name" LabelK8sAppTag string = "kubefox.xigxog.io/app-tag" LabelK8sAppVersion string = "kubefox.xigxog.io/app-version" LabelK8sComponent string = "app.kubernetes.io/component" LabelK8sComponentHash string = "kubefox.xigxog.io/component-hash" LabelK8sComponentHashShort string = "kubefox.xigxog.io/component-hash-short" LabelK8sComponentType string = "kubefox.xigxog.io/component-type" LabelK8sEnvironment string = "kubefox.xigxog.io/environment" LabelK8sInstance string = "app.kubernetes.io/instance" LabelK8sPlatform string = "kubefox.xigxog.io/platform" LabelK8sRelManifest string = "kubefox.xigxog.io/release-manifest" LabelK8sRuntimeVersion string = "kubefox.xigxog.io/runtime-version" LabelK8sVirtualEnvironment string = "kubefox.xigxog.io/virtual-environment" )
Kubernetes Labels
const ( AnnotationLastApplied string = "kubectl.kubernetes.io/last-applied-configuration" AnnotationTemplateData string = "kubefox.xigxog.io/template-data" AnnotationTemplateDataHash string = "kubefox.xigxog.io/template-data-hash" )
Kubernetes Annotations
const ( LabelOCIApp string = "com.xigxog.kubefox.app" LabelOCIComponent string = "com.xigxog.kubefox.component" LabelOCICreated string = "org.opencontainers.image.created" LabelOCIRevision string = "org.opencontainers.image.revision" LabelOCISource string = "org.opencontainers.image.source" )
Container Labels
const ( FinalizerEnvironmentProtection string = "kubefox.xigxog.io/environment-protection" FinalizerReleaseProtection string = "kubefox.xigxog.io/release-protection" )
const ( EnvNodeName = "KUBEFOX_NODE" EnvPodIP = "KUBEFOX_POD_IP" EnvPodName = "KUBEFOX_POD" )
const ( PlatformComponentBootstrap string = "bootstrap" PlatformComponentBroker string = "broker" PlatformComponentHTTPSrv string = "httpsrv" PlatformComponentNATS string = "nats" PlatformComponentOperator string = "operator" )
const ( ConditionTypeAvailable string = "Available" ConditionTypeProgressing string = "Progressing" ConditionTypeActiveReleaseAvailable string = "ActiveReleaseAvailable" ConditionTypeReleasePending string = "ReleasePending" )
const ( ConditionReasonComponentDeploymentFailed string = "ComponentDeploymentFailed" ConditionReasonComponentDeploymentProgressing string = "ComponentDeploymentProgressing" ConditionReasonComponentsAvailable string = "ComponentsAvailable" ConditionReasonComponentsDeployed string = "ComponentsDeployed" ConditionReasonContextAvailable string = "ContextAvailable" ConditionReasonEnvironmentNotFound string = "EnvironmentNotFound" ConditionReasonNoRelease string = "NoRelease" ConditionReasonPendingDeadlineExceeded string = "PendingDeadlineExceeded" ConditionReasonPlatformComponentsAvailable string = "PlatformComponentsAvailable" ConditionReasonProblemsFound string = "ProblemsFound" ConditionReasonReconcileFailed string = "ReconcileFailed" ConditionReasonReleaseActivated string = "ReleaseActivated" ConditionReasonReleasePending string = "ReleasePending" )
const ( GRPCKeyApp string = "app" GRPCKeyHash string = "hash" GRPCKeyComponent string = "component" GRPCKeyId string = "id" GRPCKeyPlatform string = "platform" GRPCKeyPod string = "pod" GRPCKeyToken string = "token" GRPCKeyType string = "type" )
gRPC metadata keys.
const ( ValKeyHeader = "header" ValKeyHost = "host" ValKeyMaxEventSize = "maxEventSize" ValKeyMethod = "method" ValKeyPath = "path" ValKeyPathSuffix = "pathSuffix" ValKeyQuery = "queryParam" ValKeyStatus = "status" ValKeyStatusCode = "statusCode" ValKeyURL = "url" ValKeyVaultURL = "vaultURL" )
Keys for well known values.
const ( HeaderAdapter = "kubefox-adapter" HeaderAppDeployment = "kubefox-app-deployment" HeaderAppDeploymentAbbrv = "kf-dep" HeaderContentLength = "Content-Length" HeaderContentType = "Content-Type" HeaderEventId = "kubefox-event-id" HeaderEventType = "kubefox-event-type" HeaderEventTypeAbbrv = "kf-type" HeaderHost = "Host" HeaderPlatform = "kubefox-platform" HeaderRelManifest = "kubefox-release-manifest" HeaderTelemetrySample = "kubefox-telemetry-sample" HeaderTelemetrySampleAbbrv = "kf-sample" HeaderTraceId = "kubefox-trace-id" HeaderVirtualEnv = "kubefox-virtual-environment" HeaderVirtualEnvAbbrv = "kf-ve" )
Headers and query params.
const ( CharSetUTF8 = "charset=UTF-8" DataSchemaEvent = "kubefox.proto.v1.Event" ContentTypeHTML = "text/html" ContentTypeJSON = "application/json" ContentTypePlain = "text/plain" ContentTypeProtobuf = "application/protobuf" )
const (
DefaultRouteId = -1
)
Variables ¶
var ( True = &t False = &f )
var ( RegexpCommit = regexp.MustCompile(`^[0-9a-f]{40}$`) RegexpGitRef = regexp.MustCompile(`^[a-z0-9][a-z0-9-\\.]{0,28}[a-z0-9]$`) RegexpHash = regexp.MustCompile(`^[0-9a-f]{32}$`) RegexpImage = regexp.MustCompile(`^.*:[a-z0-9-]{40}$`) RegexpName = regexp.MustCompile(`^[a-z0-9][a-z0-9-]{0,28}[a-z0-9]$`) RegexpUUID = regexp.MustCompile(`^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`) )
var ( KubeFoxHome = utils.EnvDef("KUBEFOX_HOME", path.Join("/", "tmp", "kubefox")) FileCACert = "ca.crt" FileTLSCert = "tls.crt" FileTLSKey = "tls.key" PathCACert = path.Join(KubeFoxHome, FileCACert) PathSvcAccToken = "/var/run/secrets/kubernetes.io/serviceaccount/token" PathTLSCert = path.Join(KubeFoxHome, FileTLSCert) PathTLSKey = path.Join(KubeFoxHome, FileTLSKey) )
var EFS embed.FS
Functions ¶
This section is empty.
Types ¶
type ArchiveReason ¶
type ArchiveReason string
const ( ArchiveReasonPendingDeadlineExceeded ArchiveReason = "PendingDeadlineExceeded" ArchiveReasonRolledBack ArchiveReason = "RolledBack" ArchiveReasonSuperseded ArchiveReason = "Superseded" )
type ComponentDefinition ¶
type ComponentDefinition struct { // +kubebuilder:validation:Required // +kubebuilder:validation:Enum=DBAdapter;KubeFox;HTTPAdapter Type ComponentType `json:"type"` Routes []RouteSpec `json:"routes,omitempty"` DefaultHandler bool `json:"defaultHandler,omitempty"` EnvVarSchema EnvVarSchema `json:"envVarSchema,omitempty"` Dependencies map[string]*Dependency `json:"dependencies,omitempty"` // +kubebuilder:validation:Required // +kubebuilder:validation:Pattern="^[a-z0-9]{32}$" Hash string `json:"hash"` Image string `json:"image,omitempty"` }
func (*ComponentDefinition) DeepCopy ¶
func (in *ComponentDefinition) DeepCopy() *ComponentDefinition
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComponentDefinition.
func (*ComponentDefinition) DeepCopyInto ¶
func (in *ComponentDefinition) DeepCopyInto(out *ComponentDefinition)
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type ComponentType ¶
type ComponentType string
const ( ComponentTypeBroker ComponentType = "Broker" // ComponentTypeDatabaseAdapter ComponentType = "DBAdapter" ComponentTypeHTTPAdapter ComponentType = "HTTPAdapter" ComponentTypeKubeFox ComponentType = "KubeFox" ComponentTypeNATS ComponentType = "NATS" )
func (ComponentType) IsAdapter ¶
func (c ComponentType) IsAdapter() bool
type Data ¶
type Data struct { // +kubebuilder:validation:Schemaless // +kubebuilder:validation:Type=object // +kubebuilder:pruning:PreserveUnknownFields Vars map[string]*Val `json:"vars,omitempty"` // +kubebuilder:validation:Schemaless // +kubebuilder:validation:Type=object // +kubebuilder:pruning:PreserveUnknownFields Secrets map[string]*Val `json:"secrets,omitempty"` }
func (*Data) DeepCopy ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Data.
func (*Data) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type DataDetails ¶
type DataDetails struct { Details `json:",inline"` Vars map[string]Details `json:"vars,omitempty"` Secrets map[string]Details `json:"secrets,omitempty"` }
func (*DataDetails) DeepCopy ¶
func (in *DataDetails) DeepCopy() *DataDetails
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DataDetails.
func (*DataDetails) DeepCopyInto ¶
func (in *DataDetails) DeepCopyInto(out *DataDetails)
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type DataKey ¶
func (*DataKey) DeepCopy ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DataKey.
func (*DataKey) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type DataProvider ¶
+kubebuilder:object:generate=false
type DataSourceKind ¶
type DataSourceKind string
const (
DataSourceKindVirtualEnvironment DataSourceKind = "VirtualEnvironment"
)
type Dependency ¶
type Dependency struct { // +kubebuilder:validation:Required // +kubebuilder:validation:Enum=DBAdapter;KubeFox;HTTPAdapter Type ComponentType `json:"type"` }
func (*Dependency) DeepCopy ¶
func (in *Dependency) DeepCopy() *Dependency
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Dependency.
func (*Dependency) DeepCopyInto ¶
func (in *Dependency) DeepCopyInto(out *Dependency)
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type Details ¶
type Details struct { Title string `json:"title,omitempty"` Description string `json:"description,omitempty"` }
func (*Details) DeepCopy ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Details.
func (*Details) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type EnvSchema ¶
type EnvSchema struct { Vars EnvVarSchema `json:"vars,omitempty"` Secrets EnvVarSchema `json:"secrets,omitempty"` }
func (*EnvSchema) DeepCopy ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EnvSchema.
func (*EnvSchema) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type EnvTemplate ¶
type EnvTemplate struct {
// contains filtered or unexported fields
}
+kubebuilder:object:generate=false
func NewEnvTemplate ¶
func NewEnvTemplate(name, template string) *EnvTemplate
func (*EnvTemplate) EnvSchema ¶
func (r *EnvTemplate) EnvSchema() *EnvSchema
func (*EnvTemplate) ParseError ¶
func (r *EnvTemplate) ParseError() error
func (*EnvTemplate) Resolve ¶
func (r *EnvTemplate) Resolve(data *Data, includeSecrets bool) (string, error)
TODO allow use of event params in templates? be useful for passing things to adapters.
func (*EnvTemplate) Template ¶
func (r *EnvTemplate) Template() string
type EnvVarDefinition ¶
type EnvVarDefinition struct { // +kubebuilder:validation:Enum=Array;Boolean;Number;String Type EnvVarType `json:"type,omitempty"` // +kubebuilder:default=false Required bool `json:"required"` }
func (*EnvVarDefinition) DeepCopy ¶
func (in *EnvVarDefinition) DeepCopy() *EnvVarDefinition
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EnvVarDefinition.
func (*EnvVarDefinition) DeepCopyInto ¶
func (in *EnvVarDefinition) DeepCopyInto(out *EnvVarDefinition)
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type EnvVarSchema ¶
type EnvVarSchema map[string]*EnvVarDefinition
func (EnvVarSchema) DeepCopy ¶
func (in EnvVarSchema) DeepCopy() EnvVarSchema
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EnvVarSchema.
func (EnvVarSchema) DeepCopyInto ¶
func (in EnvVarSchema) DeepCopyInto(out *EnvVarSchema)
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (EnvVarSchema) Validate ¶
func (e EnvVarSchema) Validate(typ string, vars map[string]*Val, src *ProblemSource, appendName bool) []Problem
type EnvVarType ¶
type EnvVarType string
const ( EnvVarTypeArray EnvVarType = "Array" EnvVarTypeBoolean EnvVarType = "Boolean" EnvVarTypeNumber EnvVarType = "Number" EnvVarTypeString EnvVarType = "String" )
type EventType ¶
type EventType string
const ( // Component event types EventTypeCron EventType = "io.kubefox.cron" EventTypeDapr EventType = "io.kubefox.dapr" EventTypeHTTP EventType = "io.kubefox.http" EventTypeKubeFox EventType = "io.kubefox.kubefox" EventTypeKubernetes EventType = "io.kubefox.kubernetes" // Platform event types EventTypeAck EventType = "io.kubefox.ack" EventTypeBootstrap EventType = "io.kubefox.bootstrap" EventTypeError EventType = "io.kubefox.error" EventTypeHealth EventType = "io.kubefox.health" EventTypeMetrics EventType = "io.kubefox.metrics" EventTypeNack EventType = "io.kubefox.nack" EventTypeRegister EventType = "io.kubefox.register" EventTypeRejected EventType = "io.kubefox.rejected" EventTypeTelemetry EventType = "io.kubefox.telemetry" EventTypeUnknown EventType = "io.kubefox.unknown" )
type FollowRedirects ¶
type FollowRedirects string
const ( FollowRedirectsAlways FollowRedirects = "Always" FollowRedirectsNever FollowRedirects = "Never" FollowRedirectsSameHost FollowRedirects = "SameHost" )
type Object ¶
type Object interface { GetNamespace() string GetName() string GetResourceVersion() string GetGeneration() int64 }
+kubebuilder:object:generate=false
type Problem ¶
type Problem struct { Type ProblemType `json:"type"` Message string `json:"message,omitempty"` // Resources and attributes causing problem. Causes []ProblemSource `json:"causes,omitempty"` }
func (*Problem) DeepCopy ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Problem.
func (*Problem) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type ProblemSource ¶
type ProblemSource struct { Kind ProblemSourceKind `json:"kind"` Name string `json:"name,omitempty"` // ObservedGeneration represents the .metadata.generation of the // ProblemSource that the problem was generated from. For instance, if the // ProblemSource .metadata.generation is currently 12, but the // observedGeneration is 9, the problem is out of date with respect to the // current state of the instance. ObservedGeneration int64 `json:"observedGeneration,omitempty"` // Path of source object attribute causing problem. Path string `json:"path,omitempty"` // Value causing problem. Pointer is used to distinguish between not set and // empty string. Value *string `json:"value,omitempty"` }
func (*ProblemSource) DeepCopy ¶
func (in *ProblemSource) DeepCopy() *ProblemSource
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ProblemSource.
func (*ProblemSource) DeepCopyInto ¶
func (in *ProblemSource) DeepCopyInto(out *ProblemSource)
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type ProblemSourceKind ¶
type ProblemSourceKind string
const ( ProblemSourceKindAppDeployment ProblemSourceKind = "AppDeployment" ProblemSourceKindComponent ProblemSourceKind = "Component" ProblemSourceKindDeployment ProblemSourceKind = "Deployment" ProblemSourceKindHTTPAdapter ProblemSourceKind = "HTTPAdapter" ProblemSourceKindRelManifest ProblemSourceKind = "ReleaseManifest" ProblemSourceKindVirtualEnv ProblemSourceKind = "VirtualEnvironment" )
type ProblemType ¶
type ProblemType string
const ( ProblemTypeAdapterNotFound ProblemType = "AdapterNotFound" ProblemTypeAppDeploymentFailed ProblemType = "AppDeploymentFailed" ProblemTypeAppDeploymentNotFound ProblemType = "AppDeploymentNotFound" ProblemTypeDependencyInvalid ProblemType = "DependencyInvalid" ProblemTypeDependencyNotFound ProblemType = "DependencyNotFound" ProblemTypeDeploymentFailed ProblemType = "DeploymentFailed" ProblemTypeDeploymentNotFound ProblemType = "DeploymentNotFound" ProblemTypeParseError ProblemType = "ParseError" ProblemTypePolicyViolation ProblemType = "PolicyViolation" ProblemTypeRelManifestFailed ProblemType = "ReleaseManifestFailed" ProblemTypeRelManifestNotFound ProblemType = "ReleaseManifestNotFound" ProblemTypeRouteConflict ProblemType = "RouteConflict" ProblemTypeVarNotFound ProblemType = "VarNotFound" ProblemTypeVarWrongType ProblemType = "VarWrongType" ProblemTypeVersionConflict ProblemType = "VersionConflict" )
type Problems ¶
type Problems []Problem
func (Problems) DeepCopy ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Problems.
func (Problems) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type ReleaseType ¶
type ReleaseType string
const ( ReleaseTypeStable ReleaseType = "Stable" ReleaseTypeTesting ReleaseType = "Testing" )
type RouteSpec ¶
type RouteSpec struct { // +kubebuilder:validation:Required Id int `json:"id"` // +kubebuilder:validation:Required Rule string `json:"rule"` Priority int `json:"priority,omitempty"` EnvVarSchema EnvVarSchema `json:"envVarSchema,omitempty"` }
func (*RouteSpec) DeepCopy ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RouteSpec.
func (*RouteSpec) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
type Val ¶
type Val struct { Type ValType `json:"-"` // contains filtered or unexported fields }
func ValArrayFloat ¶
func ValArrayInt ¶
func ValArrayString ¶
func (*Val) ArrayFloat ¶
ArrayFloat returns the array value if type is ArrayNumber. Otherwise nil is returned.
func (*Val) ArrayInt ¶
ArrayInt returns the array value if type is ArrayNumber. Otherwise nil is returned.
func (*Val) ArrayString ¶
ArrayString returns the array value if type is ArrayString or ArrayNumber. Otherwise nil is returned.
func (*Val) Bool ¶
Bool returns the boolean value if type is Bool. If type is Number, false will be returned if value is 0, otherwise true is returned. If type is String, an attempt to parse the boolean value will be made. If parsing fails or type is Array false will be returned.
func (*Val) DeepCopy ¶
DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Val.
func (*Val) DeepCopyInto ¶
DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (*Val) EnvVarType ¶
func (val *Val) EnvVarType() EnvVarType
func (*Val) Float ¶
Float returns the float64 value if type is Number. If type is Bool 1 will be returned if true, otherwise 0 is returned. If type is String an attempt to parse the number will be made. If parsing fails or type is Array 0 will be returned.
func (*Val) Int ¶
Int returns the int value if type is Number. If type is Bool 1 will be returned if true, otherwise 0 is returned. If type is String an attempt to parse the number will be made. If parsing fails or type is Array 0 will be returned.
func (*Val) IsArrayNumber ¶
func (*Val) IsArrayString ¶
func (*Val) MarshalJSON ¶
MarshalJSON implements the json.Marshaller interface.
func (*Val) String ¶
String returns the string value if type is String. If type is Array the JSON representation of the array is returned. Otherwise default string format of the value is returned.
func (*Val) UnmarshalJSON ¶
UnmarshalJSON implements the json.Unmarshaller interface.
Source Files
¶
Directories
¶
Path | Synopsis |
---|---|
+kubebuilder:object:generate=true
|
+kubebuilder:object:generate=true |
v1alpha1
Package v1alpha1 contains API Schema definitions for the k8s v1alpha1 API group +kubebuilder:object:generate=true +groupName=kubefox.xigxog.io
|
Package v1alpha1 contains API Schema definitions for the k8s v1alpha1 API group +kubebuilder:object:generate=true +groupName=kubefox.xigxog.io |