Skip to content

Commit

Permalink
feature: install submariner broker and globalnet config on hub cluster
Browse files Browse the repository at this point in the history
Signed-off-by: SataQiu <shidaqiu2018@gmail.com>
  • Loading branch information
SataQiu committed Dec 3, 2021
1 parent ebe5158 commit 95325bb
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 8 deletions.
77 changes: 69 additions & 8 deletions pkg/hub/submarinerbroker/controller.go
Expand Up @@ -4,14 +4,18 @@ import (
"context"
"crypto/rand"
"embed"
"net"
"strconv"
"strings"

"github.com/open-cluster-management/submariner-addon/pkg/helpers"
"github.com/open-cluster-management/submariner-addon/pkg/resource"
"github.com/openshift/library-go/pkg/controller/factory"
"github.com/openshift/library-go/pkg/operator/events"
"github.com/pkg/errors"
"github.com/submariner-io/admiral/pkg/finalizer"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
Expand All @@ -20,11 +24,17 @@ import (
clientset "open-cluster-management.io/api/client/cluster/clientset/versioned/typed/cluster/v1beta1"
clusterinformerv1beta1 "open-cluster-management.io/api/client/cluster/informers/externalversions/cluster/v1beta1"
clusterlisterv1beta1 "open-cluster-management.io/api/client/cluster/listers/cluster/v1beta1"
clusterv1beta1 "open-cluster-management.io/api/cluster/v1beta1"
)

const (
brokerFinalizer = "cluster.open-cluster-management.io/submariner-cleanup"
ipSecPSKSecretLength = 48
brokerFinalizer = "cluster.open-cluster-management.io/submariner-cleanup"
brokerComponentsAnnotationKey = "cluster.open-cluster-management.io/brokerComponents"
brokerDefaultCustomDomainsAnnotationKey = "cluster.open-cluster-management.io/brokerDefaultCustomDomains"
brokerGlobalnetCIDRRangeAnnotationKey = "cluster.open-cluster-management.io/brokerGlobalnetCIDRRange"
brokerDefaultGlobalnetClusterSizeAnnotationKey = "cluster.open-cluster-management.io/brokerDefaultGlobalnetClusterSize"
brokerGlobalnetEnabledAnnotationKey = "cluster.open-cluster-management.io/brokerGlobalnetEnabled"
ipSecPSKSecretLength = 48
)

var staticResourceFiles = []string{
Expand All @@ -43,7 +53,12 @@ type submarinerBrokerController struct {
}

type brokerConfig struct {
SubmarinerNamespace string
SubmarinerNamespace string
GlobalnetCIDRRange string
Components []string
DefaultCustomDomains []string
DefaultGlobalnetClusterSize uint
GlobalnetEnabled bool
}

func NewController(
Expand Down Expand Up @@ -73,7 +88,7 @@ func (c *submarinerBrokerController) sync(ctx context.Context, syncCtx factory.S
klog.V(4).Infof("Reconciling ClusterSet %q", clusterSetName)

clusterSet, err := c.clusterSetLister.Get(clusterSetName)
if errors.IsNotFound(err) {
if apierrors.IsNotFound(err) {
// ClusterSet not found, could have been deleted, do nothing.
return nil
}
Expand All @@ -90,8 +105,9 @@ func (c *submarinerBrokerController) sync(ctx context.Context, syncCtx factory.S
return err
}

config := &brokerConfig{
SubmarinerNamespace: helpers.GenerateBrokerName(clusterSet.Name),
config, err := buildBrokerConfig(clusterSet)
if err != nil {
return errors.WithMessagef(err, "Failed to build broker config")
}

assetFunc := resource.AssetFromFile(manifestFiles, config)
Expand All @@ -114,9 +130,54 @@ func (c *submarinerBrokerController) sync(ctx context.Context, syncCtx factory.S
return c.createIPSecPSKSecret(config.SubmarinerNamespace)
}

func buildBrokerConfig(clusterSet *clusterv1beta1.ManagedClusterSet) (*brokerConfig, error) {
config := &brokerConfig{
SubmarinerNamespace: helpers.GenerateBrokerName(clusterSet.Name),
Components: []string{"service-discovery", "connectivity"},
DefaultCustomDomains: nil,
GlobalnetCIDRRange: "242.0.0.0/8",
DefaultGlobalnetClusterSize: 65536,
GlobalnetEnabled: false,
}

if v, ok := clusterSet.Annotations[brokerComponentsAnnotationKey]; ok {
config.Components = strings.Split(strings.TrimSpace(v), ",")
}

if v, ok := clusterSet.Annotations[brokerDefaultCustomDomainsAnnotationKey]; ok {
config.DefaultCustomDomains = strings.Split(strings.TrimSpace(v), ",")
}

if v, ok := clusterSet.Annotations[brokerGlobalnetCIDRRangeAnnotationKey]; ok {
globalnetCIDRRange := strings.TrimSpace(v)
if _, _, err := net.ParseCIDR(globalnetCIDRRange); err != nil {
return nil, errors.WithMessagef(err, "Found invalid globalnet CIDR value %q", globalnetCIDRRange)
}
config.GlobalnetCIDRRange = globalnetCIDRRange
}

if v, ok := clusterSet.Annotations[brokerDefaultGlobalnetClusterSizeAnnotationKey]; ok {
defaultGlobalnetClusterSize, err := strconv.Atoi(strings.TrimSpace(v))
if err != nil || defaultGlobalnetClusterSize <= 0 {
return nil, errors.WithMessagef(err, "Found invalid default globalnet cluster size value %q", v)
}
config.DefaultGlobalnetClusterSize = uint(defaultGlobalnetClusterSize)
}

if v, ok := clusterSet.Annotations[brokerGlobalnetEnabledAnnotationKey]; ok {
globalnetEnabled, err := strconv.ParseBool(strings.TrimSpace(v))
if err != nil {
return nil, errors.WithMessagef(err, "Found invalid globalnet enabled value %q", v)
}
config.GlobalnetEnabled = globalnetEnabled
}

return config, nil
}

func (c *submarinerBrokerController) createIPSecPSKSecret(brokerNamespace string) error {
_, err := c.kubeClient.CoreV1().Secrets(brokerNamespace).Get(context.TODO(), helpers.IPSecPSKSecretName, metav1.GetOptions{})
if errors.IsNotFound(err) {
if apierrors.IsNotFound(err) {
psk := make([]byte, ipSecPSKSecretLength)
if _, err := rand.Read(psk); err != nil {
return err
Expand Down
12 changes: 12 additions & 0 deletions pkg/hub/submarinerbroker/manifests/broker-globalnet-cm.yaml
@@ -0,0 +1,12 @@
apiVersion: v1
kind: ConfigMap
metadata:
labels:
component: submariner-globalnet
name: submariner-globalnet-info
namespace: {{ .SubmarinerNamespace }}
data:
clusterinfo: "[]"
globalnetCidrRange: "{{ .GlobalnetCIDRRange }}"
globalnetClusterSize: "{{ .DefaultGlobalnetClusterSize }}"
globalnetEnabled: "{{ .GlobalnetEnabled }}"
17 changes: 17 additions & 0 deletions pkg/hub/submarinerbroker/manifests/broker.yaml
@@ -0,0 +1,17 @@
apiVersion: submariner.io/v1alpha1
kind: Broker
metadata:
name: broker
namespace: {{ .SubmarinerNamespace }}
spec:
components:
{{ range $ele := .Components }}
- {{ $ele }}
{{ end }}
defaultCustomDomains:
{{ range $ele := .DefaultCustomDomains }}
- {{ $ele }}
{{ end }}
globalnetCIDRRange: "{{ .GlobalnetCIDRRange }}"
defaultGlobalnetClusterSize: {{ .DefaultGlobalnetClusterSize }}
globalnetEnabled: {{ .GlobalnetEnabled }}

0 comments on commit 95325bb

Please sign in to comment.