mirror of
https://github.com/kubevela/kubevela.git
synced 2026-08-27 16:17:34 +00:00
add ocm-hub (#1906)
This commit is contained in:
@@ -0,0 +1,436 @@
|
||||
apiVersion: v1
|
||||
data:
|
||||
initializer: |
|
||||
apiVersion: core.oam.dev/v1beta1
|
||||
kind: Initializer
|
||||
metadata:
|
||||
annotations:
|
||||
addons.oam.dev/description: ocm-cluster-manager can deploy an OCM hub cluster environment.
|
||||
name: ocm-cluster-manager
|
||||
namespace: open-cluster-management
|
||||
spec:
|
||||
appTemplate:
|
||||
spec:
|
||||
components:
|
||||
- name: cluster-manager-role-binding
|
||||
properties:
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
name: cluster-manager-role-binding
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: cluster-manager-cluster-role
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: cluster-manager-service-account
|
||||
namespace: open-cluster-management
|
||||
type: raw
|
||||
- name: cluster-manager-cluster-role
|
||||
properties:
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
metadata:
|
||||
name: cluster-manager-cluster-role
|
||||
rules:
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- configmaps
|
||||
- namespaces
|
||||
- serviceaccounts
|
||||
- services
|
||||
- secrets
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- patch
|
||||
- delete
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- nodes
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- watch
|
||||
- apiGroups:
|
||||
- authorization.k8s.io
|
||||
resources:
|
||||
- subjectaccessreviews
|
||||
verbs:
|
||||
- create
|
||||
- apiGroups:
|
||||
- ""
|
||||
- events.k8s.io
|
||||
resources:
|
||||
- events
|
||||
verbs:
|
||||
- create
|
||||
- patch
|
||||
- update
|
||||
- apiGroups:
|
||||
- apps
|
||||
resources:
|
||||
- deployments
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- patch
|
||||
- delete
|
||||
- apiGroups:
|
||||
- rbac.authorization.k8s.io
|
||||
resources:
|
||||
- clusterrolebindings
|
||||
- rolebindings
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- patch
|
||||
- delete
|
||||
- apiGroups:
|
||||
- rbac.authorization.k8s.io
|
||||
resources:
|
||||
- clusterroles
|
||||
- roles
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- patch
|
||||
- delete
|
||||
- escalate
|
||||
- bind
|
||||
- apiGroups:
|
||||
- apiextensions.k8s.io
|
||||
resources:
|
||||
- customresourcedefinitions
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- patch
|
||||
- delete
|
||||
- apiGroups:
|
||||
- apiregistration.k8s.io
|
||||
resources:
|
||||
- apiservices
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- patch
|
||||
- delete
|
||||
- apiGroups:
|
||||
- admissionregistration.k8s.io
|
||||
resources:
|
||||
- validatingwebhookconfigurations
|
||||
- mutatingwebhookconfigurations
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- patch
|
||||
- delete
|
||||
- apiGroups:
|
||||
- operator.open-cluster-management.io
|
||||
resources:
|
||||
- clustermanagers
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- watch
|
||||
- update
|
||||
- delete
|
||||
- apiGroups:
|
||||
- operator.open-cluster-management.io
|
||||
resources:
|
||||
- clustermanagers/status
|
||||
verbs:
|
||||
- update
|
||||
- patch
|
||||
type: raw
|
||||
- name: cluster-manager-service-account
|
||||
properties:
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: cluster-manager-service-account
|
||||
namespace: open-cluster-management
|
||||
type: raw
|
||||
- name: clustermanagers.operator.open-cluster-management.io
|
||||
properties:
|
||||
apiVersion: apiextensions.k8s.io/v1
|
||||
kind: CustomResourceDefinition
|
||||
metadata:
|
||||
name: clustermanagers.operator.open-cluster-management.io
|
||||
spec:
|
||||
group: operator.open-cluster-management.io
|
||||
names:
|
||||
kind: ClusterManager
|
||||
listKind: ClusterManagerList
|
||||
plural: clustermanagers
|
||||
singular: clustermanager
|
||||
preserveUnknownFields: false
|
||||
scope: Cluster
|
||||
versions:
|
||||
- name: v1
|
||||
schema:
|
||||
openAPIV3Schema:
|
||||
description: ClusterManager configures the controllers on the hub that govern registration and work distribution for attached Klusterlets. ClusterManager will only be deployed in open-cluster-management-hub namespace.
|
||||
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: Spec represents a desired deployment configuration of controllers that govern registration and work distribution for attached Klusterlets.
|
||||
properties:
|
||||
placementImagePullSpec:
|
||||
default: quay.io/open-cluster-management/placement
|
||||
description: PlacementImagePullSpec represents the desired image configuration of placement controller/webhook installed on hub.
|
||||
type: string
|
||||
registrationImagePullSpec:
|
||||
default: quay.io/open-cluster-management/registration
|
||||
description: RegistrationImagePullSpec represents the desired image of registration controller/webhook installed on hub.
|
||||
type: string
|
||||
workImagePullSpec:
|
||||
default: quay.io/open-cluster-management/work
|
||||
description: WorkImagePullSpec represents the desired image configuration of work controller/webhook installed on hub.
|
||||
type: string
|
||||
type: object
|
||||
status:
|
||||
description: Status represents the current status of controllers that govern the lifecycle of managed clusters.
|
||||
properties:
|
||||
conditions:
|
||||
description: 'Conditions contain the different condition statuses for this ClusterManager. Valid condition types are: Applied: Components in hub are applied. Available: Components in hub are available and ready to serve. Progressing: Components in hub are in a transitioning state. Degraded: Components in hub do not match the desired configuration and only provide degraded service.'
|
||||
items:
|
||||
description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
|
||||
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
|
||||
generations:
|
||||
description: Generations are used to determine when an item needs to be reconciled or has changed in a way that needs a reaction.
|
||||
items:
|
||||
description: GenerationStatus keeps track of the generation for a given resource so that decisions about forced updates can be made. The definition matches the GenerationStatus defined in github.com/openshift/api/v1
|
||||
properties:
|
||||
group:
|
||||
description: group is the group of the resource that you're tracking
|
||||
type: string
|
||||
lastGeneration:
|
||||
description: lastGeneration is the last generation of the resource that controller applies
|
||||
format: int64
|
||||
type: integer
|
||||
name:
|
||||
description: name is the name of the resource that you're tracking
|
||||
type: string
|
||||
namespace:
|
||||
description: namespace is where the resource that you're tracking is
|
||||
type: string
|
||||
resource:
|
||||
description: resource is the resource type of the resource that you're tracking
|
||||
type: string
|
||||
version:
|
||||
description: version is the version of the resource that you're tracking
|
||||
type: string
|
||||
type: object
|
||||
type: array
|
||||
observedGeneration:
|
||||
description: ObservedGeneration is the last generation change you've dealt with
|
||||
format: int64
|
||||
type: integer
|
||||
relatedResources:
|
||||
description: RelatedResources are used to track the resources that are related to this ClusterManager.
|
||||
items:
|
||||
description: RelatedResourceMeta represents the resource that is managed by an operator
|
||||
properties:
|
||||
group:
|
||||
description: group is the group of the resource that you're tracking
|
||||
type: string
|
||||
name:
|
||||
description: name is the name of the resource that you're tracking
|
||||
type: string
|
||||
namespace:
|
||||
description: namespace is where the thing you're tracking is
|
||||
type: string
|
||||
resource:
|
||||
description: resource is the resource type of the resource that you're tracking
|
||||
type: string
|
||||
version:
|
||||
description: version is the version of the thing you're tracking
|
||||
type: string
|
||||
type: object
|
||||
type: array
|
||||
type: object
|
||||
type: object
|
||||
served: true
|
||||
storage: true
|
||||
subresources:
|
||||
status: {}
|
||||
status:
|
||||
acceptedNames:
|
||||
kind: ""
|
||||
plural: ""
|
||||
conditions: []
|
||||
storedVersions: []
|
||||
type: raw
|
||||
- name: cluster-manager-hub
|
||||
properties:
|
||||
apiVersion: operator.open-cluster-management.io/v1
|
||||
kind: ClusterManager
|
||||
metadata:
|
||||
name: cluster-manager-hub
|
||||
spec:
|
||||
placementImagePullSpec: registry.cn-beijing.aliyuncs.com/ocm/placement
|
||||
registrationImagePullSpec: registry.cn-beijing.aliyuncs.com/ocm/registration:latest
|
||||
workImagePullSpec: registry.cn-beijing.aliyuncs.com/ocm/work
|
||||
type: raw
|
||||
- name: cluster-manager-controller
|
||||
properties:
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
labels:
|
||||
app: cluster-manager
|
||||
name: cluster-manager-controller
|
||||
namespace: open-cluster-management
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: cluster-manager
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: cluster-manager
|
||||
spec:
|
||||
affinity:
|
||||
podAntiAffinity:
|
||||
preferredDuringSchedulingIgnoredDuringExecution:
|
||||
- podAffinityTerm:
|
||||
labelSelector:
|
||||
matchExpressions:
|
||||
- key: app
|
||||
operator: In
|
||||
values:
|
||||
- cluster-manager
|
||||
topologyKey: failure-domain.beta.kubernetes.io/zone
|
||||
weight: 70
|
||||
- podAffinityTerm:
|
||||
labelSelector:
|
||||
matchExpressions:
|
||||
- key: app
|
||||
operator: In
|
||||
values:
|
||||
- cluster-manager
|
||||
topologyKey: kubernetes.io/hostname
|
||||
weight: 30
|
||||
containers:
|
||||
- args:
|
||||
- /registration-operator
|
||||
- hub
|
||||
image: registry.cn-beijing.aliyuncs.com/ocm/registration-operator:latest
|
||||
imagePullPolicy: IfNotPresent
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 8443
|
||||
scheme: HTTPS
|
||||
initialDelaySeconds: 2
|
||||
periodSeconds: 10
|
||||
name: registration-operator
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 8443
|
||||
scheme: HTTPS
|
||||
initialDelaySeconds: 2
|
||||
resources:
|
||||
requests:
|
||||
cpu: 10m
|
||||
memory: 128Mi
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- ALL
|
||||
privileged: false
|
||||
runAsNonRoot: true
|
||||
serviceAccountName: cluster-manager-service-account
|
||||
type: raw
|
||||
status:
|
||||
rollout:
|
||||
batchRollingState: ""
|
||||
currentBatch: 0
|
||||
lastTargetAppRevision: ""
|
||||
rollingState: ""
|
||||
upgradedReadyReplicas: 0
|
||||
upgradedReplicas: 0
|
||||
status:
|
||||
observedGeneration: 0
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
annotations:
|
||||
addons.oam.dev/description: ocm-cluster-manager can deploy an OCM hub cluster environment.
|
||||
labels:
|
||||
addons.oam.dev/type: ocm-cluster-manager
|
||||
name: ocm-cluster-manager
|
||||
@@ -5,6 +5,8 @@ go 1.16
|
||||
require (
|
||||
cuelang.org/go v0.2.2
|
||||
github.com/AlecAivazis/survey/v2 v2.1.1
|
||||
github.com/Masterminds/semver v1.5.0 // indirect
|
||||
github.com/Masterminds/sprig v2.22.0+incompatible
|
||||
github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8
|
||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
|
||||
github.com/aryann/difflib v0.0.0-20210328193216-ff5ff6dc229b
|
||||
|
||||
@@ -87,9 +87,13 @@ github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YH
|
||||
github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
|
||||
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
|
||||
github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
|
||||
github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
|
||||
github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
|
||||
github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
|
||||
github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=
|
||||
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
|
||||
github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60=
|
||||
github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o=
|
||||
github.com/Masterminds/sprig/v3 v3.1.0/go.mod h1:ONGMf7UfYGAbMXCZmQLy8x3lCDIPrEZE/rU8pmrbihA=
|
||||
github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8=
|
||||
github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk=
|
||||
|
||||
@@ -3,7 +3,6 @@ kind: ComponentDefinition
|
||||
metadata:
|
||||
annotations:
|
||||
definition.oam.dev/description: kustomize can fetching, building, updating and applying Kustomize manifests from git repo.
|
||||
creationTimestamp: null
|
||||
name: kustomize
|
||||
namespace: vela-system
|
||||
spec:
|
||||
@@ -22,13 +21,10 @@ kind: Initializer
|
||||
metadata:
|
||||
annotations:
|
||||
addons.oam.dev/description: Flux is a set of continuous and progressive delivery solutions for Kubernetes
|
||||
creationTimestamp: null
|
||||
name: fluxcd
|
||||
namespace: flux-system
|
||||
spec:
|
||||
appTemplate:
|
||||
metadata:
|
||||
creationTimestamp: null
|
||||
spec:
|
||||
components:
|
||||
- name: alerts.notification.toolkit.fluxcd.io
|
||||
|
||||
@@ -0,0 +1,426 @@
|
||||
apiVersion: core.oam.dev/v1beta1
|
||||
kind: Initializer
|
||||
metadata:
|
||||
annotations:
|
||||
addons.oam.dev/description: ocm-cluster-manager can deploy an OCM hub cluster environment.
|
||||
name: ocm-cluster-manager
|
||||
namespace: open-cluster-management
|
||||
spec:
|
||||
appTemplate:
|
||||
spec:
|
||||
components:
|
||||
- name: cluster-manager-role-binding
|
||||
properties:
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
name: cluster-manager-role-binding
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: cluster-manager-cluster-role
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: cluster-manager-service-account
|
||||
namespace: open-cluster-management
|
||||
type: raw
|
||||
- name: cluster-manager-cluster-role
|
||||
properties:
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
metadata:
|
||||
name: cluster-manager-cluster-role
|
||||
rules:
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- configmaps
|
||||
- namespaces
|
||||
- serviceaccounts
|
||||
- services
|
||||
- secrets
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- patch
|
||||
- delete
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- nodes
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- watch
|
||||
- apiGroups:
|
||||
- authorization.k8s.io
|
||||
resources:
|
||||
- subjectaccessreviews
|
||||
verbs:
|
||||
- create
|
||||
- apiGroups:
|
||||
- ""
|
||||
- events.k8s.io
|
||||
resources:
|
||||
- events
|
||||
verbs:
|
||||
- create
|
||||
- patch
|
||||
- update
|
||||
- apiGroups:
|
||||
- apps
|
||||
resources:
|
||||
- deployments
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- patch
|
||||
- delete
|
||||
- apiGroups:
|
||||
- rbac.authorization.k8s.io
|
||||
resources:
|
||||
- clusterrolebindings
|
||||
- rolebindings
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- patch
|
||||
- delete
|
||||
- apiGroups:
|
||||
- rbac.authorization.k8s.io
|
||||
resources:
|
||||
- clusterroles
|
||||
- roles
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- patch
|
||||
- delete
|
||||
- escalate
|
||||
- bind
|
||||
- apiGroups:
|
||||
- apiextensions.k8s.io
|
||||
resources:
|
||||
- customresourcedefinitions
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- patch
|
||||
- delete
|
||||
- apiGroups:
|
||||
- apiregistration.k8s.io
|
||||
resources:
|
||||
- apiservices
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- patch
|
||||
- delete
|
||||
- apiGroups:
|
||||
- admissionregistration.k8s.io
|
||||
resources:
|
||||
- validatingwebhookconfigurations
|
||||
- mutatingwebhookconfigurations
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- patch
|
||||
- delete
|
||||
- apiGroups:
|
||||
- operator.open-cluster-management.io
|
||||
resources:
|
||||
- clustermanagers
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- watch
|
||||
- update
|
||||
- delete
|
||||
- apiGroups:
|
||||
- operator.open-cluster-management.io
|
||||
resources:
|
||||
- clustermanagers/status
|
||||
verbs:
|
||||
- update
|
||||
- patch
|
||||
type: raw
|
||||
- name: cluster-manager-service-account
|
||||
properties:
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: cluster-manager-service-account
|
||||
namespace: open-cluster-management
|
||||
type: raw
|
||||
- name: clustermanagers.operator.open-cluster-management.io
|
||||
properties:
|
||||
apiVersion: apiextensions.k8s.io/v1
|
||||
kind: CustomResourceDefinition
|
||||
metadata:
|
||||
name: clustermanagers.operator.open-cluster-management.io
|
||||
spec:
|
||||
group: operator.open-cluster-management.io
|
||||
names:
|
||||
kind: ClusterManager
|
||||
listKind: ClusterManagerList
|
||||
plural: clustermanagers
|
||||
singular: clustermanager
|
||||
preserveUnknownFields: false
|
||||
scope: Cluster
|
||||
versions:
|
||||
- name: v1
|
||||
schema:
|
||||
openAPIV3Schema:
|
||||
description: ClusterManager configures the controllers on the hub that govern registration and work distribution for attached Klusterlets. ClusterManager will only be deployed in open-cluster-management-hub namespace.
|
||||
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: Spec represents a desired deployment configuration of controllers that govern registration and work distribution for attached Klusterlets.
|
||||
properties:
|
||||
placementImagePullSpec:
|
||||
default: quay.io/open-cluster-management/placement
|
||||
description: PlacementImagePullSpec represents the desired image configuration of placement controller/webhook installed on hub.
|
||||
type: string
|
||||
registrationImagePullSpec:
|
||||
default: quay.io/open-cluster-management/registration
|
||||
description: RegistrationImagePullSpec represents the desired image of registration controller/webhook installed on hub.
|
||||
type: string
|
||||
workImagePullSpec:
|
||||
default: quay.io/open-cluster-management/work
|
||||
description: WorkImagePullSpec represents the desired image configuration of work controller/webhook installed on hub.
|
||||
type: string
|
||||
type: object
|
||||
status:
|
||||
description: Status represents the current status of controllers that govern the lifecycle of managed clusters.
|
||||
properties:
|
||||
conditions:
|
||||
description: 'Conditions contain the different condition statuses for this ClusterManager. Valid condition types are: Applied: Components in hub are applied. Available: Components in hub are available and ready to serve. Progressing: Components in hub are in a transitioning state. Degraded: Components in hub do not match the desired configuration and only provide degraded service.'
|
||||
items:
|
||||
description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
|
||||
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
|
||||
generations:
|
||||
description: Generations are used to determine when an item needs to be reconciled or has changed in a way that needs a reaction.
|
||||
items:
|
||||
description: GenerationStatus keeps track of the generation for a given resource so that decisions about forced updates can be made. The definition matches the GenerationStatus defined in github.com/openshift/api/v1
|
||||
properties:
|
||||
group:
|
||||
description: group is the group of the resource that you're tracking
|
||||
type: string
|
||||
lastGeneration:
|
||||
description: lastGeneration is the last generation of the resource that controller applies
|
||||
format: int64
|
||||
type: integer
|
||||
name:
|
||||
description: name is the name of the resource that you're tracking
|
||||
type: string
|
||||
namespace:
|
||||
description: namespace is where the resource that you're tracking is
|
||||
type: string
|
||||
resource:
|
||||
description: resource is the resource type of the resource that you're tracking
|
||||
type: string
|
||||
version:
|
||||
description: version is the version of the resource that you're tracking
|
||||
type: string
|
||||
type: object
|
||||
type: array
|
||||
observedGeneration:
|
||||
description: ObservedGeneration is the last generation change you've dealt with
|
||||
format: int64
|
||||
type: integer
|
||||
relatedResources:
|
||||
description: RelatedResources are used to track the resources that are related to this ClusterManager.
|
||||
items:
|
||||
description: RelatedResourceMeta represents the resource that is managed by an operator
|
||||
properties:
|
||||
group:
|
||||
description: group is the group of the resource that you're tracking
|
||||
type: string
|
||||
name:
|
||||
description: name is the name of the resource that you're tracking
|
||||
type: string
|
||||
namespace:
|
||||
description: namespace is where the thing you're tracking is
|
||||
type: string
|
||||
resource:
|
||||
description: resource is the resource type of the resource that you're tracking
|
||||
type: string
|
||||
version:
|
||||
description: version is the version of the thing you're tracking
|
||||
type: string
|
||||
type: object
|
||||
type: array
|
||||
type: object
|
||||
type: object
|
||||
served: true
|
||||
storage: true
|
||||
subresources:
|
||||
status: {}
|
||||
status:
|
||||
acceptedNames:
|
||||
kind: ""
|
||||
plural: ""
|
||||
conditions: []
|
||||
storedVersions: []
|
||||
type: raw
|
||||
- name: cluster-manager-hub
|
||||
properties:
|
||||
apiVersion: operator.open-cluster-management.io/v1
|
||||
kind: ClusterManager
|
||||
metadata:
|
||||
name: cluster-manager-hub
|
||||
spec:
|
||||
placementImagePullSpec: registry.cn-beijing.aliyuncs.com/ocm/placement
|
||||
registrationImagePullSpec: registry.cn-beijing.aliyuncs.com/ocm/registration:latest
|
||||
workImagePullSpec: registry.cn-beijing.aliyuncs.com/ocm/work
|
||||
type: raw
|
||||
- name: cluster-manager-controller
|
||||
properties:
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
labels:
|
||||
app: cluster-manager
|
||||
name: cluster-manager-controller
|
||||
namespace: open-cluster-management
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: cluster-manager
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: cluster-manager
|
||||
spec:
|
||||
affinity:
|
||||
podAntiAffinity:
|
||||
preferredDuringSchedulingIgnoredDuringExecution:
|
||||
- podAffinityTerm:
|
||||
labelSelector:
|
||||
matchExpressions:
|
||||
- key: app
|
||||
operator: In
|
||||
values:
|
||||
- cluster-manager
|
||||
topologyKey: failure-domain.beta.kubernetes.io/zone
|
||||
weight: 70
|
||||
- podAffinityTerm:
|
||||
labelSelector:
|
||||
matchExpressions:
|
||||
- key: app
|
||||
operator: In
|
||||
values:
|
||||
- cluster-manager
|
||||
topologyKey: kubernetes.io/hostname
|
||||
weight: 30
|
||||
containers:
|
||||
- args:
|
||||
- /registration-operator
|
||||
- hub
|
||||
image: registry.cn-beijing.aliyuncs.com/ocm/registration-operator:latest
|
||||
imagePullPolicy: IfNotPresent
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 8443
|
||||
scheme: HTTPS
|
||||
initialDelaySeconds: 2
|
||||
periodSeconds: 10
|
||||
name: registration-operator
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 8443
|
||||
scheme: HTTPS
|
||||
initialDelaySeconds: 2
|
||||
resources:
|
||||
requests:
|
||||
cpu: 10m
|
||||
memory: 128Mi
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- ALL
|
||||
privileged: false
|
||||
runAsNonRoot: true
|
||||
serviceAccountName: cluster-manager-service-account
|
||||
type: raw
|
||||
status:
|
||||
rollout:
|
||||
batchRollingState: ""
|
||||
currentBatch: 0
|
||||
lastTargetAppRevision: ""
|
||||
rollingState: ""
|
||||
upgradedReadyReplicas: 0
|
||||
upgradedReplicas: 0
|
||||
status:
|
||||
observedGeneration: 0
|
||||
@@ -12,4 +12,4 @@ spec:
|
||||
- name: {{ .Name }}
|
||||
type: raw
|
||||
properties:
|
||||
{{ .Content }} {{ end }}
|
||||
{{ .Content | indent 12 }} {{ end }}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
name: cluster-manager-role-binding
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
name: cluster-manager-cluster-role
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: cluster-manager-service-account
|
||||
namespace: open-cluster-management
|
||||
+138
@@ -0,0 +1,138 @@
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRole
|
||||
metadata:
|
||||
name: cluster-manager-cluster-role
|
||||
rules:
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- configmaps
|
||||
- namespaces
|
||||
- serviceaccounts
|
||||
- services
|
||||
- secrets
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- patch
|
||||
- delete
|
||||
- apiGroups:
|
||||
- ""
|
||||
resources:
|
||||
- nodes
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- watch
|
||||
- apiGroups:
|
||||
- authorization.k8s.io
|
||||
resources:
|
||||
- subjectaccessreviews
|
||||
verbs:
|
||||
- create
|
||||
- apiGroups:
|
||||
- ""
|
||||
- events.k8s.io
|
||||
resources:
|
||||
- events
|
||||
verbs:
|
||||
- create
|
||||
- patch
|
||||
- update
|
||||
- apiGroups:
|
||||
- apps
|
||||
resources:
|
||||
- deployments
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- patch
|
||||
- delete
|
||||
- apiGroups:
|
||||
- rbac.authorization.k8s.io
|
||||
resources:
|
||||
- clusterrolebindings
|
||||
- rolebindings
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- patch
|
||||
- delete
|
||||
- apiGroups:
|
||||
- rbac.authorization.k8s.io
|
||||
resources:
|
||||
- clusterroles
|
||||
- roles
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- patch
|
||||
- delete
|
||||
- escalate
|
||||
- bind
|
||||
- apiGroups:
|
||||
- apiextensions.k8s.io
|
||||
resources:
|
||||
- customresourcedefinitions
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- patch
|
||||
- delete
|
||||
- apiGroups:
|
||||
- apiregistration.k8s.io
|
||||
resources:
|
||||
- apiservices
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- patch
|
||||
- delete
|
||||
- apiGroups:
|
||||
- admissionregistration.k8s.io
|
||||
resources:
|
||||
- validatingwebhookconfigurations
|
||||
- mutatingwebhookconfigurations
|
||||
verbs:
|
||||
- create
|
||||
- get
|
||||
- list
|
||||
- update
|
||||
- watch
|
||||
- patch
|
||||
- delete
|
||||
- apiGroups:
|
||||
- operator.open-cluster-management.io
|
||||
resources:
|
||||
- clustermanagers
|
||||
verbs:
|
||||
- get
|
||||
- list
|
||||
- watch
|
||||
- update
|
||||
- delete
|
||||
- apiGroups:
|
||||
- operator.open-cluster-management.io
|
||||
resources:
|
||||
- clustermanagers/status
|
||||
verbs:
|
||||
- update
|
||||
- patch
|
||||
@@ -0,0 +1,5 @@
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: cluster-manager-service-account
|
||||
namespace: open-cluster-management
|
||||
@@ -0,0 +1,236 @@
|
||||
apiVersion: apiextensions.k8s.io/v1
|
||||
kind: CustomResourceDefinition
|
||||
metadata:
|
||||
name: clustermanagers.operator.open-cluster-management.io
|
||||
spec:
|
||||
group: operator.open-cluster-management.io
|
||||
names:
|
||||
kind: ClusterManager
|
||||
listKind: ClusterManagerList
|
||||
plural: clustermanagers
|
||||
singular: clustermanager
|
||||
preserveUnknownFields: false
|
||||
scope: Cluster
|
||||
versions:
|
||||
- name: v1
|
||||
schema:
|
||||
openAPIV3Schema:
|
||||
description:
|
||||
ClusterManager configures the controllers on the hub that govern
|
||||
registration and work distribution for attached Klusterlets. ClusterManager
|
||||
will only be deployed in open-cluster-management-hub namespace.
|
||||
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:
|
||||
Spec represents a desired deployment configuration of controllers
|
||||
that govern registration and work distribution for attached Klusterlets.
|
||||
properties:
|
||||
placementImagePullSpec:
|
||||
default: quay.io/open-cluster-management/placement
|
||||
description:
|
||||
PlacementImagePullSpec represents the desired image configuration
|
||||
of placement controller/webhook installed on hub.
|
||||
type: string
|
||||
registrationImagePullSpec:
|
||||
default: quay.io/open-cluster-management/registration
|
||||
description:
|
||||
RegistrationImagePullSpec represents the desired image
|
||||
of registration controller/webhook installed on hub.
|
||||
type: string
|
||||
workImagePullSpec:
|
||||
default: quay.io/open-cluster-management/work
|
||||
description:
|
||||
WorkImagePullSpec represents the desired image configuration
|
||||
of work controller/webhook installed on hub.
|
||||
type: string
|
||||
type: object
|
||||
status:
|
||||
description:
|
||||
Status represents the current status of controllers that
|
||||
govern the lifecycle of managed clusters.
|
||||
properties:
|
||||
conditions:
|
||||
description:
|
||||
"Conditions contain the different condition statuses
|
||||
for this ClusterManager. Valid condition types are: Applied: Components
|
||||
in hub are applied. Available: Components in hub are available and
|
||||
ready to serve. Progressing: Components in hub are in a transitioning
|
||||
state. Degraded: Components in hub do not match the desired configuration
|
||||
and only provide degraded service."
|
||||
items:
|
||||
description:
|
||||
"Condition contains details for one aspect of the current
|
||||
state of this API Resource. --- This struct is intended for direct
|
||||
use as an array at the field path .status.conditions. For example,
|
||||
type FooStatus struct{ // Represents the observations of a
|
||||
foo's current state. // Known .status.conditions.type are:
|
||||
\"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type
|
||||
\ // +patchStrategy=merge // +listType=map // +listMapKey=type
|
||||
\ Conditions []metav1.Condition `json:\"conditions,omitempty\"
|
||||
patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"`
|
||||
\n // other fields }"
|
||||
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
|
||||
generations:
|
||||
description:
|
||||
Generations are used to determine when an item needs
|
||||
to be reconciled or has changed in a way that needs a reaction.
|
||||
items:
|
||||
description:
|
||||
GenerationStatus keeps track of the generation for
|
||||
a given resource so that decisions about forced updates can be
|
||||
made. The definition matches the GenerationStatus defined in github.com/openshift/api/v1
|
||||
properties:
|
||||
group:
|
||||
description:
|
||||
group is the group of the resource that you're
|
||||
tracking
|
||||
type: string
|
||||
lastGeneration:
|
||||
description:
|
||||
lastGeneration is the last generation of the resource
|
||||
that controller applies
|
||||
format: int64
|
||||
type: integer
|
||||
name:
|
||||
description: name is the name of the resource that you're tracking
|
||||
type: string
|
||||
namespace:
|
||||
description:
|
||||
namespace is where the resource that you're tracking
|
||||
is
|
||||
type: string
|
||||
resource:
|
||||
description:
|
||||
resource is the resource type of the resource that
|
||||
you're tracking
|
||||
type: string
|
||||
version:
|
||||
description:
|
||||
version is the version of the resource that you're
|
||||
tracking
|
||||
type: string
|
||||
type: object
|
||||
type: array
|
||||
observedGeneration:
|
||||
description:
|
||||
ObservedGeneration is the last generation change you've
|
||||
dealt with
|
||||
format: int64
|
||||
type: integer
|
||||
relatedResources:
|
||||
description:
|
||||
RelatedResources are used to track the resources that
|
||||
are related to this ClusterManager.
|
||||
items:
|
||||
description:
|
||||
RelatedResourceMeta represents the resource that is
|
||||
managed by an operator
|
||||
properties:
|
||||
group:
|
||||
description:
|
||||
group is the group of the resource that you're
|
||||
tracking
|
||||
type: string
|
||||
name:
|
||||
description: name is the name of the resource that you're tracking
|
||||
type: string
|
||||
namespace:
|
||||
description: namespace is where the thing you're tracking is
|
||||
type: string
|
||||
resource:
|
||||
description:
|
||||
resource is the resource type of the resource that
|
||||
you're tracking
|
||||
type: string
|
||||
version:
|
||||
description: version is the version of the thing you're tracking
|
||||
type: string
|
||||
type: object
|
||||
type: array
|
||||
type: object
|
||||
type: object
|
||||
served: true
|
||||
storage: true
|
||||
subresources:
|
||||
status: {}
|
||||
status:
|
||||
acceptedNames:
|
||||
kind: ""
|
||||
plural: ""
|
||||
conditions: []
|
||||
storedVersions: []
|
||||
@@ -0,0 +1,8 @@
|
||||
apiVersion: operator.open-cluster-management.io/v1
|
||||
kind: ClusterManager
|
||||
metadata:
|
||||
name: cluster-manager-hub
|
||||
spec:
|
||||
registrationImagePullSpec: registry.cn-beijing.aliyuncs.com/ocm/registration:latest
|
||||
workImagePullSpec: registry.cn-beijing.aliyuncs.com/ocm/work
|
||||
placementImagePullSpec: registry.cn-beijing.aliyuncs.com/ocm/placement
|
||||
@@ -0,0 +1,70 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
labels:
|
||||
app: cluster-manager
|
||||
name: cluster-manager-controller
|
||||
namespace: open-cluster-management
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: cluster-manager
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: cluster-manager
|
||||
spec:
|
||||
affinity:
|
||||
podAntiAffinity:
|
||||
preferredDuringSchedulingIgnoredDuringExecution:
|
||||
- podAffinityTerm:
|
||||
labelSelector:
|
||||
matchExpressions:
|
||||
- key: app
|
||||
operator: In
|
||||
values:
|
||||
- cluster-manager
|
||||
topologyKey: failure-domain.beta.kubernetes.io/zone
|
||||
weight: 70
|
||||
- podAffinityTerm:
|
||||
labelSelector:
|
||||
matchExpressions:
|
||||
- key: app
|
||||
operator: In
|
||||
values:
|
||||
- cluster-manager
|
||||
topologyKey: kubernetes.io/hostname
|
||||
weight: 30
|
||||
containers:
|
||||
- args:
|
||||
- /registration-operator
|
||||
- hub
|
||||
image: registry.cn-beijing.aliyuncs.com/ocm/registration-operator:latest
|
||||
imagePullPolicy: IfNotPresent
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 8443
|
||||
scheme: HTTPS
|
||||
initialDelaySeconds: 2
|
||||
periodSeconds: 10
|
||||
name: registration-operator
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /healthz
|
||||
port: 8443
|
||||
scheme: HTTPS
|
||||
initialDelaySeconds: 2
|
||||
resources:
|
||||
requests:
|
||||
cpu: 10m
|
||||
memory: 128Mi
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- ALL
|
||||
privileged: false
|
||||
runAsNonRoot: true
|
||||
serviceAccountName: cluster-manager-service-account
|
||||
@@ -0,0 +1,15 @@
|
||||
apiVersion: core.oam.dev/v1beta1
|
||||
kind: Initializer
|
||||
metadata:
|
||||
annotations:
|
||||
addons.oam.dev/description: "ocm-cluster-manager can deploy an OCM hub cluster environment."
|
||||
name: ocm-cluster-manager
|
||||
namespace: open-cluster-management
|
||||
spec:
|
||||
appTemplate:
|
||||
spec:
|
||||
components: {{ range .ResourceFiles }}
|
||||
- name: {{ .Name }}
|
||||
type: raw
|
||||
properties:
|
||||
{{ .Content | indent 12 }} {{ end }}
|
||||
@@ -30,6 +30,7 @@ import (
|
||||
"strings"
|
||||
"text/template"
|
||||
|
||||
"github.com/Masterminds/sprig"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||
@@ -68,6 +69,7 @@ type velaFile struct {
|
||||
type AddonInfo struct {
|
||||
ResourceFiles []velaFile
|
||||
DefinitionFiles []velaFile
|
||||
HasDefs bool
|
||||
Name string
|
||||
Namespace string
|
||||
Description string
|
||||
@@ -89,75 +91,59 @@ func walkAllAddons(path string) ([]string, error) {
|
||||
return addons, nil
|
||||
}
|
||||
|
||||
func indentedContent(content string, indent int) string {
|
||||
var res string
|
||||
lines := strings.Split(content, "\n")
|
||||
indentSpace := strings.Repeat(" ", indent)
|
||||
for i, line := range lines {
|
||||
res += indentSpace + line
|
||||
if i != len(lines)-1 {
|
||||
res += "\n"
|
||||
func pathExist(path string) bool {
|
||||
_, err := os.Stat(path)
|
||||
if err != nil && os.IsNotExist(err) {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func newWalkFn(files *[]velaFile) filepath.WalkFunc {
|
||||
return func(path string, info fs.FileInfo, _ error) error {
|
||||
if info.IsDir() {
|
||||
return nil
|
||||
}
|
||||
content, err := ioutil.ReadFile(filepath.Clean(path))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
obj := new(unstructured.Unstructured)
|
||||
if err = yaml.Unmarshal(content, obj); err != nil {
|
||||
return err
|
||||
}
|
||||
*files = append(*files, velaFile{
|
||||
RelativePath: path,
|
||||
Name: obj.GetName(),
|
||||
Content: string(content),
|
||||
})
|
||||
return nil
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func getAddonInfo(addon string, addonsPath string) (*AddonInfo, error) {
|
||||
addonRoot := filepath.Clean(addonsPath + "/" + addon)
|
||||
resourceRoot := filepath.Clean(addonRoot + "/" + ResourceDir)
|
||||
defRoot := filepath.Clean(addonRoot + "/" + ComponentDefDir)
|
||||
resourcesFiles := make([]velaFile, 0, 2)
|
||||
defFiles := make([]velaFile, 0, 2)
|
||||
resourcesFiles := make([]velaFile, 0)
|
||||
defFiles := make([]velaFile, 0)
|
||||
addInfo := &AddonInfo{
|
||||
Name: addon,
|
||||
TemplatePath: filepath.Join(addonRoot, InitializerTemplateName),
|
||||
}
|
||||
if err := filepath.Walk(resourceRoot, func(path string, info fs.FileInfo, _ error) error {
|
||||
if info.IsDir() {
|
||||
return nil
|
||||
}
|
||||
content, err := ioutil.ReadFile(filepath.Clean(path))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
obj := new(unstructured.Unstructured)
|
||||
if err = yaml.Unmarshal(content, obj); err != nil {
|
||||
return err
|
||||
}
|
||||
resourcesFiles = append(resourcesFiles, velaFile{
|
||||
RelativePath: path,
|
||||
Name: obj.GetName(),
|
||||
Content: indentedContent(string(content), 12),
|
||||
})
|
||||
return nil
|
||||
}); err != nil {
|
||||
if err := filepath.Walk(resourceRoot, newWalkFn(&resourcesFiles)); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
addInfo.ResourceFiles = resourcesFiles
|
||||
if err := filepath.Walk(defRoot, func(path string, info fs.FileInfo, _ error) error {
|
||||
if info.IsDir() {
|
||||
return nil
|
||||
}
|
||||
content, err := ioutil.ReadFile(filepath.Clean(path))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
obj := new(unstructured.Unstructured)
|
||||
if err = yaml.Unmarshal(content, obj); err != nil {
|
||||
return err
|
||||
}
|
||||
defFiles = append(defFiles, velaFile{
|
||||
RelativePath: path,
|
||||
Name: obj.GetName(),
|
||||
Content: string(content),
|
||||
})
|
||||
return nil
|
||||
}); err != nil {
|
||||
if !pathExist(defRoot) {
|
||||
return addInfo, nil
|
||||
}
|
||||
if err := filepath.Walk(defRoot, newWalkFn(&defFiles)); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
addInfo.HasDefs = true
|
||||
addInfo.DefinitionFiles = defFiles
|
||||
return addInfo, nil
|
||||
}
|
||||
@@ -182,7 +168,9 @@ func WriteToFile(filename string, data string) error {
|
||||
}
|
||||
|
||||
func generateInitializer(addon *AddonInfo) (*v1beta1.Initializer, error) {
|
||||
t, err := template.ParseFiles(addon.TemplatePath)
|
||||
templatePath := strings.Split(addon.TemplatePath, "/")
|
||||
templateName := templatePath[len(templatePath)-1]
|
||||
t, err := template.New(templateName).Funcs(sprig.TxtFuncMap()).ParseFiles(addon.TemplatePath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -252,7 +240,7 @@ func storeInitAndDef(init *v1beta1.Initializer, cds []*v1beta1.ComponentDefiniti
|
||||
return err
|
||||
}
|
||||
filename := path.Join(addonPath, InitializerFileDir, addonName+".yaml")
|
||||
spliter := "---\n"
|
||||
splitter := "---\n"
|
||||
cdContents := make([]string, 0, len(cds))
|
||||
for _, cd := range cds {
|
||||
cdContent, err := yaml.Marshal(cd)
|
||||
@@ -261,12 +249,16 @@ func storeInitAndDef(init *v1beta1.Initializer, cds []*v1beta1.ComponentDefiniti
|
||||
}
|
||||
cdContents = append(cdContents, string(cdContent))
|
||||
}
|
||||
fileContent := strings.Join(append(cdContents, string(initContent)), spliter)
|
||||
fileContent := strings.Join(append(cdContents, string(initContent)), splitter)
|
||||
removeTimestampInplace(&fileContent)
|
||||
return WriteToFile(filename, fileContent)
|
||||
}
|
||||
|
||||
func getComponentDefs(info *AddonInfo) ([]*v1beta1.ComponentDefinition, error) {
|
||||
cds := make([]*v1beta1.ComponentDefinition, 0)
|
||||
if !info.HasDefs {
|
||||
return cds, nil
|
||||
}
|
||||
for _, file := range info.DefinitionFiles {
|
||||
cd := v1beta1.ComponentDefinition{}
|
||||
err := yaml.Unmarshal([]byte(file.Content), &cd)
|
||||
@@ -276,8 +268,8 @@ func getComponentDefs(info *AddonInfo) ([]*v1beta1.ComponentDefinition, error) {
|
||||
cds = append(cds, &cd)
|
||||
}
|
||||
return cds, nil
|
||||
|
||||
}
|
||||
|
||||
func main() {
|
||||
var addonsPath string
|
||||
var storePath string
|
||||
|
||||
Reference in New Issue
Block a user