diff --git a/pkg/apiserver/apiserver.go b/pkg/apiserver/apiserver.go index fbbc12d8f..e1903238c 100644 --- a/pkg/apiserver/apiserver.go +++ b/pkg/apiserver/apiserver.go @@ -61,6 +61,7 @@ import ( devopsv1alpha2 "kubesphere.io/kubesphere/pkg/kapis/devops/v1alpha2" devopsv1alpha3 "kubesphere.io/kubesphere/pkg/kapis/devops/v1alpha3" iamapi "kubesphere.io/kubesphere/pkg/kapis/iam/v1alpha2" + kubeedgev1alpha1 "kubesphere.io/kubesphere/pkg/kapis/kubeedge/v1alpha1" meteringv1alpha1 "kubesphere.io/kubesphere/pkg/kapis/metering/v1alpha1" monitoringv1alpha3 "kubesphere.io/kubesphere/pkg/kapis/monitoring/v1alpha3" networkv1alpha2 "kubesphere.io/kubesphere/pkg/kapis/network/v1alpha2" @@ -269,6 +270,7 @@ func (s *APIServer) installKubeSphereAPIs() { urlruntime.Must(alertingv2alpha1.AddToContainer(s.container, s.InformerFactory, s.KubernetesClient.Prometheus(), s.AlertingClient, s.Config.AlertingOptions)) urlruntime.Must(version.AddToContainer(s.container, s.KubernetesClient.Discovery())) + urlruntime.Must(kubeedgev1alpha1.AddToContainer(s.container, s.Config.KubeEdgeOptions.Endpoint)) } func (s *APIServer) Run(stopCh <-chan struct{}) (err error) { diff --git a/pkg/apiserver/config/config.go b/pkg/apiserver/config/config.go index 41a7b99c9..ab221b189 100644 --- a/pkg/apiserver/config/config.go +++ b/pkg/apiserver/config/config.go @@ -28,6 +28,7 @@ import ( "kubesphere.io/kubesphere/pkg/simple/client/devops/jenkins" "kubesphere.io/kubesphere/pkg/simple/client/events" "kubesphere.io/kubesphere/pkg/simple/client/k8s" + "kubesphere.io/kubesphere/pkg/simple/client/kubeedge" "kubesphere.io/kubesphere/pkg/simple/client/ldap" "kubesphere.io/kubesphere/pkg/simple/client/logging" "kubesphere.io/kubesphere/pkg/simple/client/monitoring/prometheus" @@ -97,6 +98,7 @@ type Config struct { AuditingOptions *auditing.Options `json:"auditing,omitempty" yaml:"auditing,omitempty" mapstructure:"auditing"` AlertingOptions *alerting.Options `json:"alerting,omitempty" yaml:"alerting,omitempty" mapstructure:"alerting"` NotificationOptions *notification.Options `json:"notification,omitempty" yaml:"notification,omitempty" mapstructure:"notification"` + KubeEdgeOptions *kubeedge.Options `json:"kubeedge,omitempty" yaml:"kubeedge,omitempty" mapstructure:"kubeedge"` } // newConfig creates a default non-empty Config @@ -120,6 +122,7 @@ func New() *Config { MultiClusterOptions: multicluster.NewOptions(), EventsOptions: events.NewEventsOptions(), AuditingOptions: auditing.NewAuditingOptions(), + KubeEdgeOptions: kubeedge.NewKubeEdgeOptions(), } } @@ -271,4 +274,8 @@ func (conf *Config) stripEmptyOptions() { if conf.AuditingOptions != nil && conf.AuditingOptions.Host == "" { conf.AuditingOptions = nil } + + if conf.KubeEdgeOptions != nil && conf.KubeEdgeOptions.Endpoint == "" { + conf.KubeEdgeOptions = nil + } } diff --git a/pkg/apiserver/config/config_test.go b/pkg/apiserver/config/config_test.go index fc572f47b..85b3ade0f 100644 --- a/pkg/apiserver/config/config_test.go +++ b/pkg/apiserver/config/config_test.go @@ -31,6 +31,7 @@ import ( "kubesphere.io/kubesphere/pkg/simple/client/devops/jenkins" "kubesphere.io/kubesphere/pkg/simple/client/events" "kubesphere.io/kubesphere/pkg/simple/client/k8s" + "kubesphere.io/kubesphere/pkg/simple/client/kubeedge" "kubesphere.io/kubesphere/pkg/simple/client/ldap" "kubesphere.io/kubesphere/pkg/simple/client/logging" "kubesphere.io/kubesphere/pkg/simple/client/monitoring/prometheus" @@ -160,6 +161,9 @@ func newTestConfig() (*Config, error) { IndexPrefix: "ks-logstash-auditing", Version: "6", }, + KubeEdgeOptions: &kubeedge.Options{ + Endpoint: "http://edge-watcher.kubeedge.svc/api/", + }, } return conf, nil } diff --git a/pkg/kapis/kubeedge/v1alpha1/register.go b/pkg/kapis/kubeedge/v1alpha1/register.go new file mode 100644 index 000000000..631f27c2c --- /dev/null +++ b/pkg/kapis/kubeedge/v1alpha1/register.go @@ -0,0 +1,35 @@ +/* +Copyright 2020 KubeSphere Authors + +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 v1 + +import ( + "github.com/emicklei/go-restful" + "k8s.io/apimachinery/pkg/runtime/schema" + "kubesphere.io/kubesphere/pkg/kapis/generic" +) + +// there are no versions specified cause we want to proxy all versions of requests to backend service +var GroupVersion = schema.GroupVersion{Group: "kubeedge.kubesphere.io", Version: ""} + +func AddToContainer(container *restful.Container, endpoint string) error { + proxy, err := generic.NewGenericProxy(endpoint, GroupVersion.Group, GroupVersion.Version) + if err != nil { + return nil + } + + return proxy.AddToContainer(container) +} diff --git a/pkg/simple/client/kubeedge/options.go b/pkg/simple/client/kubeedge/options.go new file mode 100644 index 000000000..a7ecb3307 --- /dev/null +++ b/pkg/simple/client/kubeedge/options.go @@ -0,0 +1,47 @@ +/* +Copyright 2021 KubeSphere Authors + +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 kubeedge + +import ( + "github.com/spf13/pflag" + "kubesphere.io/kubesphere/pkg/utils/reflectutils" +) + +type Options struct { + Endpoint string `json:"endpoint" yaml:"endpoint"` +} + +func NewKubeEdgeOptions() *Options { + return &Options{ + Endpoint: "", + } +} + +func (o *Options) ApplyTo(options *Options) { + reflectutils.Override(options, o) +} + +func (o *Options) Validate() []error { + errs := []error{} + + return errs +} + +func (o *Options) AddFlags(fs *pflag.FlagSet, c *Options) { + fs.StringVar(&o.Endpoint, "edge-watcher-endpoint", c.Endpoint, + "edge watcher endpoint for kubeedge v1alpha1.") +}