Skip to content

Commit

Permalink
Create one ManagedClusterView per app on the first failing cluster (#121
Browse files Browse the repository at this point in the history
)

* Create one ManagedClusterView per app on the first failing cluster

Signed-off-by: Xiangjing Li <xiangli@redhat.com>
  • Loading branch information
xiangjingli authored Mar 15, 2022
1 parent a3be3da commit 2877d2e
Show file tree
Hide file tree
Showing 9 changed files with 848 additions and 3 deletions.
7 changes: 7 additions & 0 deletions cmd/appsubsummary/exec/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"k8s.io/client-go/rest"
"k8s.io/klog/v2"
appsubapi "open-cluster-management.io/multicloud-operators-subscription/pkg/apis"
managedClusterView "open-cluster-management.io/multicloud-operators-subscription/pkg/apis/view/v1beta1"
"open-cluster-management.io/multicloud-operators-subscription/pkg/controller"
"open-cluster-management.io/multicloud-operators-subscription/pkg/utils"
ctrl "sigs.k8s.io/controller-runtime"
Expand Down Expand Up @@ -82,6 +83,12 @@ func RunManager() {
os.Exit(1)
}

// Setup manageClusterView Scheme for manager
if err := managedClusterView.AddToScheme(mgr.GetScheme()); err != nil {
klog.Error(err, "")
os.Exit(1)
}

// Setup all Controllers.
if err := controller.AddAppSubSummaryToManager(mgr, options.SyncInterval); err != nil {
klog.Error(err, "")
Expand Down
126 changes: 126 additions & 0 deletions hack/test/view.open-cluster-management.io_managedclusterviews.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@

---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.5.0
creationTimestamp: null
name: managedclusterviews.view.open-cluster-management.io
spec:
group: view.open-cluster-management.io
names:
kind: ManagedClusterView
listKind: ManagedClusterViewList
plural: managedclusterviews
singular: managedclusterview
scope: Namespaced
versions:
- name: v1beta1
schema:
openAPIV3Schema:
description: ManagedClusterView is the view of resources on a managed cluster
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 defines the desired configuration of a view
properties:
scope:
description: Scope is the scope of the view on a cluster
properties:
apiGroup:
description: Group is the api group of the resources
type: string
kind:
description: Kind is the kind of the subject
type: string
name:
description: Name is the name of the subject
type: string
namespace:
description: Name is the name of the subject
type: string
resource:
description: Resource is the resource type of the subject
type: string
updateIntervalSeconds:
description: UpdateIntervalSeconds is the interval to update view
format: int32
type: integer
version:
description: Version is the version of the subject
type: string
type: object
type: object
status:
description: Status describes current status of a view
properties:
conditions:
description: Conditions represents the conditions of this resource on managed cluster
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
result:
description: Result references the related result of the view
nullable: true
type: object
x-kubernetes-embedded-resource: true
x-kubernetes-preserve-unknown-fields: true
type: object
type: object
served: true
storage: true
subresources:
status: {}
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []
38 changes: 38 additions & 0 deletions pkg/apis/view/v1beta1/groupversion_info.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

// Package v1beta1 contains API Schema definitions for the view v1beta1 API group
// +kubebuilder:object:generate=true
// +groupName=view.open-cluster-management.io
package v1beta1

import (
"k8s.io/apimachinery/pkg/runtime/schema"
"sigs.k8s.io/controller-runtime/pkg/scheme"
)

var (
GroupName = "view.open-cluster-management.io"

// GroupVersion is group version used to register these objects
GroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1beta1"}

// SchemeBuilder is used to add go types to the GroupVersionKind scheme
SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}

// AddToScheme adds the types in this group-version to the given scheme.
AddToScheme = SchemeBuilder.AddToScheme
)
108 changes: 108 additions & 0 deletions pkg/apis/view/v1beta1/view_types.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package v1beta1

import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
)

// +kubebuilder:object:root=true
// +kubebuilder:subresource:status

// ManagedClusterView is the view of resources on a managed cluster
type ManagedClusterView struct {
metav1.TypeMeta `json:",inline"`
// Standard object's metadata.
// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata
// +optional
metav1.ObjectMeta `json:"metadata,omitempty"`

// Spec defines the desired configuration of a view
// +optional
Spec ViewSpec `json:"spec,omitempty"`

// Status describes current status of a view
// +optional
Status ViewStatus `json:"status,omitempty"`
}

// +kubebuilder:object:root=true

// ManagedClusterViewList is a list of all the ManagedClusterView
type ManagedClusterViewList struct {
metav1.TypeMeta `json:",inline"`
// Standard list metadata.
// More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds
// +optional
metav1.ListMeta `json:"metadata,omitempty"`

// List of ManagedClusterView objects.
Items []ManagedClusterView `json:"items"`
}

// ViewSpec defines the desired configuration of a view
type ViewSpec struct {
// Scope is the scope of the view on a cluster
Scope ViewScope `json:"scope,omitempty"`
}

// ViewStatus returns the status of the view
type ViewStatus struct {
// Conditions represents the conditions of this resource on managed cluster
// +optional
Conditions []metav1.Condition `json:"conditions,omitempty"`

// Result references the related result of the view
// +nullable
// +optional
// +kubebuilder:validation:EmbeddedResource
// +kubebuilder:pruning:PreserveUnknownFields
Result runtime.RawExtension `json:"result,omitempty"`
}

// ViewScope represents the scope of resources to be viewed
type ViewScope struct {
// Group is the api group of the resources
Group string `json:"apiGroup,omitempty"`

// Version is the version of the subject
// +optional
Version string `json:"version,omitempty"`

// Kind is the kind of the subject
// +optional
Kind string `json:"kind,omitempty"`

// Resource is the resource type of the subject
// +optional
Resource string `json:"resource,omitempty"`

// Name is the name of the subject
// +optional
Name string `json:"name,omitempty"`

// Name is the name of the subject
// +optional
Namespace string `json:"namespace,omitempty"`

// UpdateIntervalSeconds is the interval to update view
// +optional
UpdateIntervalSeconds int32 `json:"updateIntervalSeconds,omitempty"`
}

// These are valid conditions of a cluster.
const (
// ConditionViewProcessing means the view is processing.
ConditionViewProcessing string = "Processing"
)

const (
ReasonResourceNameInvalid string = "ResourceNameInvalid"
ReasonResourceTypeInvalid string = "ResourceTypeInvalid"
ReasonResourceGVKInvalid string = "ResourceGVKInvalid"
ReasonGetResourceFailed string = "GetResourceFailed"
ReasonGetResource string = "GetResourceProcessing"
)

func init() {
SchemeBuilder.Register(&ManagedClusterView{}, &ManagedClusterViewList{})
}
Loading

0 comments on commit 2877d2e

Please sign in to comment.