mirror of
https://github.com/rancher/os.git
synced 2025-09-08 18:20:32 +00:00
Add operator
This commit is contained in:
104
pkg/controllers/managedos/managedos.go
Normal file
104
pkg/controllers/managedos/managedos.go
Normal file
@@ -0,0 +1,104 @@
|
||||
package managedos
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/rancher/fleet/pkg/apis/fleet.cattle.io/v1alpha1"
|
||||
provv1 "github.com/rancher/os/pkg/apis/rancheros.cattle.io/v1"
|
||||
"github.com/rancher/os/pkg/clients"
|
||||
fleetcontrollers "github.com/rancher/os/pkg/generated/controllers/fleet.cattle.io/v1alpha1"
|
||||
ranchercontrollers "github.com/rancher/os/pkg/generated/controllers/management.cattle.io/v3"
|
||||
oscontrollers "github.com/rancher/os/pkg/generated/controllers/rancheros.cattle.io/v1"
|
||||
"github.com/rancher/wrangler/pkg/name"
|
||||
"github.com/rancher/wrangler/pkg/relatedresource"
|
||||
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
)
|
||||
|
||||
func Register(ctx context.Context, clients *clients.Clients) {
|
||||
h := &handler{
|
||||
bundleCache: clients.Fleet.Bundle().Cache(),
|
||||
settingsCache: clients.Rancher.Setting().Cache(),
|
||||
}
|
||||
|
||||
relatedresource.Watch(ctx,
|
||||
"mcc-from-bundle-trigger",
|
||||
relatedresource.OwnerResolver(true, provv1.SchemeGroupVersion.String(), "ManagedOSImage"),
|
||||
clients.OS.ManagedOSImage(),
|
||||
clients.Fleet.Bundle())
|
||||
oscontrollers.RegisterManagedOSImageGeneratingHandler(ctx,
|
||||
clients.OS.ManagedOSImage(),
|
||||
clients.Apply.
|
||||
WithSetOwnerReference(true, true).
|
||||
WithCacheTypes(
|
||||
clients.OS.ManagedOSImage(),
|
||||
clients.Fleet.Bundle()),
|
||||
"Defined",
|
||||
"mos-bundle",
|
||||
h.OnChange,
|
||||
nil)
|
||||
}
|
||||
|
||||
type handler struct {
|
||||
bundleCache fleetcontrollers.BundleCache
|
||||
settingsCache ranchercontrollers.SettingCache
|
||||
}
|
||||
|
||||
func (h *handler) defaultRegistry() (string, error) {
|
||||
setting, err := h.settingsCache.Get("system-default-registry")
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if setting.Value == "" {
|
||||
return setting.Default, nil
|
||||
}
|
||||
return setting.Value, nil
|
||||
}
|
||||
|
||||
func (h *handler) OnChange(mos *provv1.ManagedOSImage, status provv1.ManagedOSImageStatus) ([]runtime.Object, provv1.ManagedOSImageStatus, error) {
|
||||
if mos.Spec.OSImage == "" {
|
||||
return nil, status, nil
|
||||
}
|
||||
|
||||
prefix, err := h.defaultRegistry()
|
||||
if err != nil {
|
||||
return nil, status, err
|
||||
}
|
||||
|
||||
resources, err := ToResources(objects(mos, prefix))
|
||||
if err != nil {
|
||||
return nil, status, err
|
||||
}
|
||||
|
||||
bundle := &v1alpha1.Bundle{
|
||||
ObjectMeta: metav1.ObjectMeta{
|
||||
Name: name.SafeConcatName("mos", mos.Name),
|
||||
Namespace: mos.Namespace,
|
||||
},
|
||||
Spec: v1alpha1.BundleSpec{
|
||||
Resources: resources,
|
||||
BundleDeploymentOptions: v1alpha1.BundleDeploymentOptions{},
|
||||
Paused: mos.Spec.Paused,
|
||||
RolloutStrategy: mos.Spec.ClusterRolloutStrategy,
|
||||
Targets: mos.Spec.Targets,
|
||||
},
|
||||
}
|
||||
|
||||
status, err = h.updateStatus(status, bundle)
|
||||
return []runtime.Object{
|
||||
bundle,
|
||||
}, status, err
|
||||
}
|
||||
|
||||
func (h *handler) updateStatus(status provv1.ManagedOSImageStatus, bundle *v1alpha1.Bundle) (provv1.ManagedOSImageStatus, error) {
|
||||
bundle, err := h.bundleCache.Get(bundle.Namespace, bundle.Name)
|
||||
if apierrors.IsNotFound(err) {
|
||||
return status, nil
|
||||
} else if err != nil {
|
||||
return status, err
|
||||
}
|
||||
|
||||
status.BundleStatus = bundle.Status
|
||||
return status, nil
|
||||
}
|
Reference in New Issue
Block a user