diff --git a/operators/datasance-pot-operator/3.4.9/manifests/datasance-iofog-operator.clusterserviceversion.yaml b/operators/datasance-pot-operator/3.4.9/manifests/datasance-iofog-operator.clusterserviceversion.yaml new file mode 100644 index 00000000000..edf193708e3 --- /dev/null +++ b/operators/datasance-pot-operator/3.4.9/manifests/datasance-iofog-operator.clusterserviceversion.yaml @@ -0,0 +1,579 @@ +--- +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + annotations: + alm-examples: >- + [ + { + "apiVersion": "datasance.com/v3", + "kind": "ControlPlane", + "metadata": { + "name": "pot" + }, + "spec": { + "replicas": { + "controller": 1 + }, + "database": { + "provider": "postgres", + "user": "user", + "host": "postgre.host", + "port": 5432, + "password": "password", + "databaseName": "dbname" + }, + "auth": { + "url": "auth.url", + "realm": "realm", + "realmKey": "realmKey", + "ssl": "none", + "controllerClient": "controllerClient", + "controllerSecret": "controllerClientSecret", + "viewerClient": "viewerClient" + }, + "images": { + "pullSecret": "pullsecret", + "controller": "ghcr.io/datasance/controller@sha256:aa896bae6c3e6eda70938a03aaa649226356d9e4a1d03ba427d4e4ee3090ca6c", + "portManager": "ghcr.io/datasance/port-manager@sha256:4bf3793e9e3cd10df9b46c459e983631393825ca788ffbbb3ec3659158ad61fe", + "proxy": "ghcr.io/datasance/proxy@sha256:276dbed0c8ef4f5b03fdf29d5c863b6f3efcae50444ce8123220c5673272860f", + "router": "ghcr.io/datasance/router@sha256:82657fc8f39d33d8ef0161cf27d705cbdc0a97dca07b22a5fe78fd4213ef0d31" + }, + "services": { + "controller": { + "type": "LoadBalancer", + "annotations": { + "service.beta.kubernetes.io/azure-load-balancer-internal": "false" + } + }, + "proxy": { + "type": "LoadBalancer", + "annotations": { + "service.beta.kubernetes.io/azure-load-balancer-internal": "false" + } + }, + "router": { + "type": "LoadBalancer", + "annotations": { + "service.beta.kubernetes.io/azure-load-balancer-internal": "false" + } + } + }, + "controller": { + "ecnViewerUrl": "pot.demo.datasance.com", + "https": true, + "secretName": "secretName" + }, + "ingresses": { + "controller": { + "annotations": { + "cert-manager.io/cluster-issuer": "letsencrypt" + }, + "ingressClassName": "nginx", + "host": "pot.demo.datasance.com", + "secretName": "secretName" + }, + "router": { + "address": "pot.demo.datasance.com", + "messagePort": 5672, + "interiorPort": 55672, + "edgePort": 45672 + }, + "httpProxy": { + "address": "pot.demo.datasance.com" + }, + "tcpProxy": { + "address": "pot.demo.datasance.com" + } + } + }, + "status": { + "conditions": [ + { + "lastTransitionTime": "2022-04-10T22:44:09Z", + "message": "", + "reason": "initial_status", + "status": "True", + "type": "deploying" + } + ] + } + } + ] + capabilities: Full Lifecycle + categories: "Developer Tools" + containerImage: ghcr.io/datasance/operator@sha256:143b9307c2520ef16b40c4c92e6faee8b24b7fb3a97682231e53236ddd532687 + description: Datasance PoT is an Enteprise version of Eclipse ioFog Platform. + features.operators.openshift.io/disconnected: "true" + features.operators.openshift.io/fips-compliant: "false" + features.operators.openshift.io/proxy-aware: "false" + features.operators.openshift.io/tls-profiles: "false" + features.operators.openshift.io/token-auth-aws: "false" + features.operators.openshift.io/token-auth-azure: "false" + features.operators.openshift.io/token-auth-gcp: "false" + operators.openshift.io/valid-subscription: '["Datasance PoT Enterprise Open Source Subscriptions based on number of Edge device that ControlPlane manages"]' + repository: https://github.com/datasance/iofog-operator + support: Datasance Teknoloji A.S. + createdAt: 2024-11-04T20:45:43Z + operators.operatorframework.io/builder: operator-sdk-v1.37.0 + operators.operatorframework.io/project_layout: go.kubebuilder.io/v4 + labels: + operatorframework.io/arch.amd64: supported + operatorframework.io/arch.arm64: supported + operatorframework.io/os.linux: supported + name: datasance-pot-operator.v3.4.9 + namespace: placeholder +spec: + apiservicedefinitions: {} + customresourcedefinitions: + owned: + - kind: ControlPlane + name: controlplanes.datasance.com + version: v3 + description: Datasance PoT supported ioFog ControlPlane CRD for managing + container workloads on Edge device + specDescriptors: + - description: Number of replicas for the controller + displayName: Controller Replicas + path: replicas.controller + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:podCount + - description: Database configuration for the Control Plane + displayName: Database + path: database + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Database + - description: Database provider (e.g., MySQL, PostgreSQL) + displayName: Provider + path: database.provider + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Database user name + displayName: User + path: database.user + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Database host address + displayName: Host + path: database.host + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Database port number + displayName: Port + path: database.port + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:number + - description: Password for the database user + displayName: Password + path: database.password + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:password + - description: Name of the database + displayName: Database Name + path: database.databaseName + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Keycloak Authentication configuration for the Control Plane + displayName: Authentication + path: auth + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Authentication + - description: URL of the Keycloak authentication server + displayName: Auth Server URL + path: auth.url + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Authentication realm name + displayName: Realm + path: auth.realm + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Key for the authentication realm + displayName: Realm Key + path: auth.realmKey + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:password + - description: SSL config for authentication server (e.g., All Request, External + Request, None) + displayName: Require SSL + path: auth.ssl + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Keycloak Client ID for the controller in the authentication server + displayName: Controller Client ID + path: auth.controllerClient + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Keycloak Secret key for the controller client + displayName: Controller Client Secret + path: auth.controllerSecret + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:password + - description: Keycloak Client ID for the viewer in the authentication server + displayName: Viewer Client ID + path: auth.viewerClient + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Configuration for images used in the Control Plane deployment + displayName: Images Configuration + path: images + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Images + - description: Secret for pulling images from a private container registry + displayName: Image Pull Secret + path: images.pullSecret + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:selector:core:v1:Secret + - description: Image for the Control Plane controller component + displayName: Controller Image + path: images.controller + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Image for the Port Manager component + displayName: Port Manager Image + path: images.portManager + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Image for the Proxy component + displayName: Proxy Image + path: images.proxy + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Image for the Router component + displayName: Router Image + path: images.router + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Configuration for services used in the Control Plane deployment + displayName: Services Configuration + path: services + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Services + - description: Service configuration for the controller component + displayName: Controller Service + path: services.controller + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:fieldGroup:ControllerService + - description: The service type for the controller component (e.g., ClusterIP, + NodePort, LoadBalancer) + displayName: Controller Service Type + path: services.controller.type + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:selector:core:v1:ServiceType + - description: Annotations for the controller service (e.g., for external load + balancer configuration) + displayName: Controller Service Annotations + path: services.controller.annotations + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Service configuration for the proxy component + displayName: Proxy Service + path: services.proxy + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:fieldGroup:ProxyService + - description: The service type for the proxy component (e.g., ClusterIP, + NodePort, LoadBalancer) + displayName: Proxy Service Type + path: services.proxy.type + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:selector:core:v1:ServiceType + - description: Annotations for the proxy service (e.g., for load balancer or + ingress settings) + displayName: Proxy Service Annotations + path: services.proxy.annotations + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Service configuration for the router component + displayName: Router Service + path: services.router + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:fieldGroup:RouterService + - description: The service type for the router component (e.g., ClusterIP, + NodePort, LoadBalancer) + displayName: Router Service Type + path: services.router.type + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:selector:core:v1:ServiceType + - description: Annotations for the router service (e.g., for configuration of + networking features) + displayName: Router Service Annotations + path: services.router.annotations + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Configuration specific to the Controller component in the Control + Plane + displayName: Controller Configuration + path: controller + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Controller + - description: Directory path for storing PID files related to the controller's + processes + displayName: PID Base Directory + path: controller.pidBaseDir + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Port for the ECN Viewer interface, allowing external access to view + the Edge Compute Network + displayName: ECN Viewer Port + path: controller.ecnViewerPort + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:number + - description: URL for accessing the ECN Viewer, if applicable + displayName: ECN Viewer URL + path: controller.ecnViewerUrl + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:url + - description: Specifies if HTTPS should be enabled for the controller's external + endpoints + displayName: Enable HTTPS + path: controller.https + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:booleanSwitch + - description: Name of the Kubernetes Secret containing SSL/TLS certificates for + secure communication with the controller + displayName: SSL Secret Name + path: controller.secretName + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:selector:core:v1:Secret + - description: Configuration specific to the Ingress resources for the Control + Plane + displayName: Ingress Configuration + path: ingresses + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Ingress + - description: Ingress configuration for the Controller component + displayName: Controller Ingress + path: ingresses.controller + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Controller Ingress + - description: Annotations to attach to the Controller Ingress resource, if any + displayName: Controller Ingress Annotations + path: ingresses.controller.annotations + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Name of the ingress class to use for the Controller Ingress + resource + displayName: Controller Ingress Class Name + path: ingresses.controller.ingressClassName + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Hostname for the Controller Ingress resource + displayName: Controller Host + path: ingresses.controller.host + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Name of the Kubernetes Secret containing SSL/TLS certificates for + secure communication for the Controller Ingress + displayName: Controller SSL Secret Name + path: ingresses.controller.secretName + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:selector:core:v1:Secret + - description: Router Ingress configuration for internal message routing + displayName: Router Ingress + path: ingresses.router + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Router Ingress + - description: Address for accessing the router ingress + displayName: Router Ingress Address + path: ingresses.router.address + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Message port for AMQP messaging + displayName: Router Message Port + path: ingresses.router.messagePort + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:number + - description: Interior port for internal cluster communication + displayName: Router Interior Port + path: ingresses.router.interiorPort + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:number + - description: Edge port for external communication to edge devices + displayName: Router Edge Port + path: ingresses.router.edgePort + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:number + - description: Ingress configuration for HTTP Proxy access + displayName: HTTP Proxy Ingress + path: ingresses.httpProxy + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:fieldGroup:HTTP Proxy Ingress + - description: Address for accessing the HTTP Proxy ingress + displayName: HTTP Proxy Address + path: ingresses.httpProxy.address + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - description: Ingress configuration for TCP Proxy access + displayName: TCP Proxy Ingress + path: ingresses.tcpProxy + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:fieldGroup:TCP Proxy Ingress + - description: Address for accessing the TCP Proxy ingress + displayName: TCP Proxy Address + path: ingresses.tcpProxy.address + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + description: ioFog Control Plane on Kubernetes + displayName: iofog-operator + icon: + - base64data: "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" + mediatype: "image/png" + install: + spec: + deployments: + - label: + name: iofog-operator + name: iofog-operator + spec: + replicas: 1 + selector: + matchLabels: + name: iofog-operator + strategy: {} + template: + metadata: + labels: + name: iofog-operator + spec: + containers: + - args: + - --enable-leader-election + command: + - iofog-operator + env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.annotations['olm.targetNamespaces'] + - name: POD_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.name + - name: OPERATOR_NAME + value: iofog-operator + image: ghcr.io/datasance/operator@sha256:143b9307c2520ef16b40c4c92e6faee8b24b7fb3a97682231e53236ddd532687 + imagePullPolicy: Always + name: iofog-operator + resources: {} + serviceAccountName: iofog-operator + terminationGracePeriodSeconds: 10 + permissions: + - rules: + - apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - "*" + - apiGroups: + - rbac.authorization.k8s.io + resources: + - roles + - rolebindings + verbs: + - "*" + - apiGroups: + - networking.k8s.io + resources: + - ingresses + - ingresses/status + verbs: + - "*" + - apiGroups: + - datasance.com + resources: + - applications + - apps + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - datasance.com + resources: + - applications/status + - apps/finalizers + - applications/finalizers + verbs: + - get + - patch + - update + - apiGroups: + - datasance.com + resources: + - controlplanes + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - datasance.com + resources: + - controlplanes/status + - controlplanes/finalizers + verbs: + - get + - patch + - update + - apiGroups: + - apps + resources: + - deployments + verbs: + - "*" + - apiGroups: + - "" + resources: + - pods + - configmaps + - configmaps/status + - events + - serviceaccounts + - services + - persistentvolumeclaims + - secrets + verbs: + - "*" + serviceAccountName: iofog-operator + strategy: deployment + installModes: + - supported: false + type: OwnNamespace + - supported: false + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - iofog + - datasance + - pot + links: + - name: Datasance PoT // Iofog Operator + url: https://docs.datasance.com + maturity: stable + minKubeVersion: 1.18.0 + provider: + name: Datasance + relatedImages: + - name: operator + image: ghcr.io/datasance/operator@sha256:143b9307c2520ef16b40c4c92e6faee8b24b7fb3a97682231e53236ddd532687 + - name: controller + image: ghcr.io/datasance/controller@sha256:aa896bae6c3e6eda70938a03aaa649226356d9e4a1d03ba427d4e4ee3090ca6c + - name: router + image: ghcr.io/datasance/router@sha256:82657fc8f39d33d8ef0161cf27d705cbdc0a97dca07b22a5fe78fd4213ef0d31 + - name: proxy + image: ghcr.io/datasance/proxy@sha256:276dbed0c8ef4f5b03fdf29d5c863b6f3efcae50444ce8123220c5673272860f + - name: port-manager + image: ghcr.io/datasance/port-manager@sha256:4bf3793e9e3cd10df9b46c459e983631393825ca788ffbbb3ec3659158ad61fe + version: 3.4.9 diff --git a/operators/datasance-pot-operator/3.4.9/manifests/datasance-pot-operator_clusterrole.yaml b/operators/datasance-pot-operator/3.4.9/manifests/datasance-pot-operator_clusterrole.yaml new file mode 100644 index 00000000000..95b865e6f8f --- /dev/null +++ b/operators/datasance-pot-operator/3.4.9/manifests/datasance-pot-operator_clusterrole.yaml @@ -0,0 +1,48 @@ +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + creationTimestamp: null + name: manager-role +rules: +- apiGroups: + - datasance.com + resources: + - applications + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - datasance.com + resources: + - applications/status + verbs: + - get + - patch + - update +- apiGroups: + - datasance.com + resources: + - controlplanes + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - datasance.com + resources: + - controlplanes/status + verbs: + - get + - patch + - update + diff --git a/operators/datasance-pot-operator/3.4.9/manifests/datasance-pot-operator_role.yaml b/operators/datasance-pot-operator/3.4.9/manifests/datasance-pot-operator_role.yaml new file mode 100644 index 00000000000..91a9290be04 --- /dev/null +++ b/operators/datasance-pot-operator/3.4.9/manifests/datasance-pot-operator_role.yaml @@ -0,0 +1,90 @@ +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: iofog-operator +rules: + - apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - '*' + - apiGroups: + - rbac.authorization.k8s.io + resources: + - roles + - rolebindings + verbs: + - '*' + - apiGroups: + - networking.k8s.io + resources: + - ingresses + - ingresses/status + verbs: + - '*' + - apiGroups: + - datasance.com + resources: + - applications + - apps + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - datasance.com + resources: + - applications/status + - apps/finalizers + - applications/finalizers + verbs: + - get + - patch + - update + - apiGroups: + - datasance.com + resources: + - controlplanes + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - apiGroups: + - datasance.com + resources: + - controlplanes/status + - controlplanes/finalizers + verbs: + - get + - patch + - update + - apiGroups: + - apps + resources: + - deployments + verbs: + - '*' + - apiGroups: + - "" + resources: + - pods + - configmaps + - configmaps/status + - events + - serviceaccounts + - services + - persistentvolumeclaims + - secrets + verbs: + - '*' + diff --git a/operators/datasance-pot-operator/3.4.9/manifests/datasance-pot-operator_rolebinding.yaml b/operators/datasance-pot-operator/3.4.9/manifests/datasance-pot-operator_rolebinding.yaml new file mode 100644 index 00000000000..58cad906b03 --- /dev/null +++ b/operators/datasance-pot-operator/3.4.9/manifests/datasance-pot-operator_rolebinding.yaml @@ -0,0 +1,13 @@ +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: iofog-operator +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: iofog-operator +subjects: + - kind: ServiceAccount + name: iofog-operator + diff --git a/operators/datasance-pot-operator/3.4.9/manifests/datasance.com-controlplanes_crd.yaml b/operators/datasance-pot-operator/3.4.9/manifests/datasance.com-controlplanes_crd.yaml new file mode 100644 index 00000000000..ca095d22fb5 --- /dev/null +++ b/operators/datasance-pot-operator/3.4.9/manifests/datasance.com-controlplanes_crd.yaml @@ -0,0 +1,304 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.15.0 + creationTimestamp: null + name: controlplanes.datasance.com +spec: + group: datasance.com + names: + kind: ControlPlane + listKind: ControlPlaneList + plural: controlplanes + singular: controlplane + scope: Namespaced + versions: + - name: v3 + schema: + openAPIV3Schema: + description: ControlPlane is the Schema for the controlplanes API. + properties: + apiVersion: + description: |- + APIVersion defines the versioned schema of this representation of an object. + Servers should convert recognized schemas to the latest internal value, and + may reject unrecognized values. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources + type: string + kind: + description: |- + Kind is a string value representing the REST resource this object represents. + Servers may infer this from the endpoint the client submits requests to. + Cannot be updated. + In CamelCase. + More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds + type: string + metadata: + type: object + spec: + description: ControlPlaneSpec defines the desired state of a ControlPlane. + properties: + auth: + description: |- + INSERT ADDITIONAL SPEC FIELDS - desired state of cluster + Important: Run "operator-sdk generate k8s" to regenerate code after modifying this file + Add custom validation using kubebuilder tags: https://book-v1.book.kubebuilder.io/beyond_basics/generating_crd.html + Auth contains Keycloak Client Configuration of Controller and ECN Viewer + properties: + controllerClient: + type: string + controllerSecret: + type: string + realm: + type: string + realmKey: + type: string + ssl: + type: string + url: + type: string + viewerClient: + type: string + required: + - controllerClient + - controllerSecret + - realm + - realmKey + - ssl + - url + - viewerClient + type: object + controller: + description: Controller contains runtime configuration for ioFog Controller + properties: + ecn: + type: string + ecnViewerPort: + type: integer + ecnViewerUrl: + type: string + https: + type: boolean + pidBaseDir: + type: string + secretName: + type: string + type: object + database: + description: Database for ioFog Controller + properties: + databaseName: + type: string + host: + type: string + password: + type: string + port: + type: integer + provider: + type: string + user: + type: string + required: + - databaseName + - host + - password + - port + - provider + - user + type: object + images: + description: Images specifies which containers to run for each component + of the ControlPlane + properties: + controller: + type: string + portManager: + type: string + proxy: + type: string + pullSecret: + type: string + router: + type: string + type: object + ingresses: + description: Ingresses allow Router and Port Manager to configure + endpoint addresses correctly + properties: + controller: + properties: + annotations: + additionalProperties: + type: string + type: object + host: + type: string + ingressClassName: + type: string + secretName: + type: string + type: object + httpProxy: + properties: + address: + type: string + type: object + router: + properties: + address: + type: string + edgePort: + type: integer + interiorPort: + type: integer + messagePort: + type: integer + type: object + tcpProxy: + properties: + address: + type: string + type: object + type: object + replicas: + description: Replicas of ioFog Controller should be 1 unless an external + DB is configured + properties: + controller: + format: int32 + type: integer + type: object + services: + description: Services should be LoadBalancer unless Ingress is being + configured + properties: + controller: + properties: + address: + type: string + annotations: + additionalProperties: + type: string + type: object + type: + type: string + type: object + proxy: + properties: + address: + type: string + annotations: + additionalProperties: + type: string + type: object + type: + type: string + type: object + router: + properties: + address: + type: string + annotations: + additionalProperties: + type: string + type: object + type: + type: string + type: object + type: object + required: + - auth + - database + type: object + status: + description: ControlPlaneStatus defines the observed state of ControlPlane. + properties: + conditions: + description: |- + INSERT ADDITIONAL STATUS FIELD - define observed state of cluster + Important: Run "make" to regenerate code after modifying this file + items: + description: "Condition contains details for one aspect of the current + state of this API Resource.\n---\nThis struct is intended for + direct use as an array at the field path .status.conditions. For + example,\n\n\n\ttype FooStatus struct{\n\t // Represents the + observations of a foo's current state.\n\t // Known .status.conditions.type + are: \"Available\", \"Progressing\", and \"Degraded\"\n\t // + +patchMergeKey=type\n\t // +patchStrategy=merge\n\t // +listType=map\n\t + \ // +listMapKey=type\n\t Conditions []metav1.Condition `json:\"conditions,omitempty\" + patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"`\n\n\n\t + \ // other fields\n\t}" + properties: + lastTransitionTime: + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. + format: int64 + minimum: 0 + type: integer + reason: + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, Unknown. + enum: + - "True" + - "False" + - Unknown + type: string + type: + description: |- + type of condition in CamelCase or in foo.example.com/CamelCase. + --- + Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be + useful (see .node.status.conditions), the ability to deconflict is important. + The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + required: + - conditions + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/operators/datasance-pot-operator/3.4.9/metadata/annotations.yaml b/operators/datasance-pot-operator/3.4.9/metadata/annotations.yaml new file mode 100644 index 00000000000..ccf9e7767a6 --- /dev/null +++ b/operators/datasance-pot-operator/3.4.9/metadata/annotations.yaml @@ -0,0 +1,15 @@ +--- +annotations: + # Core bundle annotations + operators.operatorframework.io.bundle.mediatype.v1: registry+v1 + operators.operatorframework.io.bundle.manifests.v1: manifests/ + operators.operatorframework.io.bundle.metadata.v1: metadata/ + operators.operatorframework.io.bundle.package.v1: datasance-pot-operator + operators.operatorframework.io.bundle.channels.v1: stable + operators.operatorframework.io.metrics.builder: operator-sdk-v1.37.0 + operators.operatorframework.io.metrics.mediatype.v1: metrics+v1 + operators.operatorframework.io.metrics.project_layout: go.kubebuilder.io/v4 + + # Annotations for testing + operators.operatorframework.io.test.mediatype.v1: scorecard+v1 + operators.operatorframework.io.test.config.v1: tests/scorecard/ \ No newline at end of file