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 a0a3eb8
Show file tree
Hide file tree
Showing 5 changed files with 127 additions and 10 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
11 changes: 8 additions & 3 deletions pkg/b3/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ func (c *Client) Identify(clusterUID string) (*kmapi.ClusterMetadata, error) {
if err != nil {
return nil, err // TODO
}
apiEndpoint := u.String()
u.Path = path.Join(u.Path, "api/v1/clustersv2/identity", clusterUID)

req, err := http.NewRequest(http.MethodGet, u.String(), nil)
Expand Down Expand Up @@ -107,6 +108,10 @@ func (c *Client) Identify(clusterUID string) (*kmapi.ClusterMetadata, error) {
if err != nil {
return nil, err
}

md.APIEndpoint = apiEndpoint
md.CABundle = string(c.caCert)

return &md, nil
}

Expand Down Expand Up @@ -155,8 +160,8 @@ var (

func (c *Client) GetIdentity() (*identityapi.ClusterIdentity, error) {
once.Do(func() error {
var status *kmapi.ClusterMetadata
status, idError = c.Identify(c.clusterUID)
var md *kmapi.ClusterMetadata
md, idError = c.Identify(c.clusterUID)
if idError != nil {
return idError
}
Expand All @@ -167,7 +172,7 @@ func (c *Client) GetIdentity() (*identityapi.ClusterIdentity, error) {
CreationTimestamp: creationTimestamp,
Generation: 1,
},
Status: *status,
Status: *md,
}
idError = nil
return idError
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 a0a3eb8

Please sign in to comment.