Skip to content

Commit

Permalink
Create and sync ace-info configmap
Browse files Browse the repository at this point in the history
Signed-off-by: Tamal Saha <[email protected]>
  • Loading branch information
tamalsaha committed Jun 11, 2024
1 parent 3827b4a commit 1844a33
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 7 deletions.
28 changes: 23 additions & 5 deletions pkg/apiserver/apiserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import (
policyinstall "kubeops.dev/ui-server/apis/policy/install"
policyapi "kubeops.dev/ui-server/apis/policy/v1alpha1"
"kubeops.dev/ui-server/pkg/b3"
clustermetacontroller "kubeops.dev/ui-server/pkg/controllers/clustermetadata"
projectquotacontroller "kubeops.dev/ui-server/pkg/controllers/projectquota"
"kubeops.dev/ui-server/pkg/graph"
"kubeops.dev/ui-server/pkg/metricshandler"
Expand Down Expand Up @@ -90,6 +91,7 @@ import (
"k8s.io/klog/v2"
"k8s.io/klog/v2/klogr"
"kmodules.xyz/authorizer"
kmapi "kmodules.xyz/client-go/api/v1"
cu "kmodules.xyz/client-go/client"
clustermeta "kmodules.xyz/client-go/cluster"
"kmodules.xyz/client-go/meta"
Expand Down Expand Up @@ -255,6 +257,11 @@ func (c completedConfig) New(ctx context.Context) (*UIServer, error) {
return nil, err
}

bc, err := b3.NewClient(c.ExtraConfig.BaseURL, c.ExtraConfig.Token, c.ExtraConfig.CACert, cid)
if err != nil {
return nil, errors.Wrap(err, "failed to create b3 api client")
}

pqr, err := projectquotacontroller.NewReconciler(mgr.GetClient(), kc).SetupWithManager(mgr)
if err != nil {
klog.Error(err, "unable to create controller", "controller", "ProjectQuota")
Expand All @@ -271,6 +278,22 @@ func (c completedConfig) New(ctx context.Context) (*UIServer, error) {
os.Exit(1)
}

if err := mgr.Add(manager.RunnableFunc(func(ctx context.Context) error {
md, err := bc.Identify(cid)
if err != nil {
return err
}
return clustermeta.UpsertClusterMetadata(mgr.GetClient(), md)
})); err != nil {
setupLog.Error(err, fmt.Sprintf("unable to upsert cluster metadata into configmap %s/%s", metav1.NamespacePublic, kmapi.AceInfoConfigMapName))
os.Exit(1)
}
err = clustermetacontroller.NewReconciler(mgr.GetClient(), bc).SetupWithManager(mgr)
if err != nil {
klog.Error(err, "unable to create controller", "controller", "ConfigMap")
os.Exit(1)
}

s := &UIServer{
GenericAPIServer: genericServer,
Manager: mgr,
Expand Down Expand Up @@ -332,11 +355,6 @@ func (c completedConfig) New(ctx context.Context) (*UIServer, error) {
}
}
{
bc, err := b3.NewClient(c.ExtraConfig.BaseURL, c.ExtraConfig.Token, c.ExtraConfig.CACert, cid)
if err != nil {
return nil, errors.Wrap(err, "failed to create b3 api client")
}

apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(identityapi.GroupName, Scheme, metav1.ParameterCodec, Codecs)

v1alpha1storage := map[string]rest.Storage{}
Expand Down
1 change: 1 addition & 0 deletions pkg/cmds/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ func NewCmdRun(ctx context.Context, out, errOut io.Writer) *cobra.Command {
return nil
},
}

flags := cmd.Flags()
o.AddFlags(flags)
utilfeature.DefaultMutableFeatureGate.AddFlag(flags)
Expand Down
3 changes: 1 addition & 2 deletions pkg/cmds/server/start.go
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,6 @@ func (o *UIServerOptions) Config() (*apiserver.Config, error) {
ClientConfig: serverConfig.ClientConfig,
PromConfig: *o.PrometheusOptions,
}

if err := o.ExtraOptions.ApplyTo(&extraConfig); err != nil {
return nil, err
}
Expand All @@ -205,7 +204,6 @@ func (o *UIServerOptions) Config() (*apiserver.Config, error) {
GenericConfig: serverConfig,
ExtraConfig: extraConfig,
}

return config, nil
}

Expand All @@ -215,6 +213,7 @@ func (o UIServerOptions) RunUIServer(ctx context.Context) error {
if err != nil {
return err
}

{
metricshandler.RegisterSelfMetrics()
telemetryMux := buildTelemetryServer(legacyregistry.DefaultGatherer)
Expand Down
94 changes: 94 additions & 0 deletions pkg/controllers/clustermetadata/cm_controller.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/*
Copyright AppsCode Inc. and Contributors.
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 clustermetadata

import (
"context"

"kubeops.dev/ui-server/pkg/b3"

core "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
kmapi "kmodules.xyz/client-go/api/v1"
clustermeta "kmodules.xyz/client-go/cluster"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/builder"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/event"
"sigs.k8s.io/controller-runtime/pkg/predicate"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
)

// ClusterMetadataReconciler reconciles a ClusterMetadata object
type ClusterMetadataReconciler struct {
kc client.Client
bc *b3.Client
clusterID string
}

var _ reconcile.Reconciler = &ClusterMetadataReconciler{}

func NewReconciler(kc client.Client, bc *b3.Client) *ClusterMetadataReconciler {
return &ClusterMetadataReconciler{
kc: kc,
bc: bc,
}
}

func (r *ClusterMetadataReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
md, err := r.bc.Identify(r.clusterID)
if err != nil {
return ctrl.Result{}, err
}

err = clustermeta.UpsertClusterMetadata(r.kc, md)
return ctrl.Result{}, err
}

// SetupWithManager sets up the controller with the Manager.
func (r *ClusterMetadataReconciler) SetupWithManager(mgr ctrl.Manager) error {
filter := func(object client.Object) bool {
return object.GetName() == kmapi.AceInfoConfigMapName &&
object.GetNamespace() == metav1.NamespacePublic
}

return ctrl.NewControllerManagedBy(mgr).
For(&core.ConfigMap{}, builder.WithPredicates(predicate.Funcs{
CreateFunc: func(e event.CreateEvent) bool {
return filter(e.Object)
},
UpdateFunc: func(e event.UpdateEvent) bool {
if e.ObjectOld == nil {
return false
}
if e.ObjectNew == nil {
return false
}
if e.ObjectNew.GetResourceVersion() == e.ObjectOld.GetResourceVersion() {
return false
}
return filter(e.ObjectNew)
},
DeleteFunc: func(e event.DeleteEvent) bool {
return filter(e.Object)
},
GenericFunc: func(e event.GenericEvent) bool {
return filter(e.Object)
},
})).
Complete(r)
}

0 comments on commit 1844a33

Please sign in to comment.